题目
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
示例 2:
输入:nums = [1,1]
输出:[2]
示例 2:
输入:nums = [1,1]
输出:[2]
提示:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
建议直接看解法三,前两个解法只是我的思路,运行超时
// 解法一:生成一个正确得数组然后进行比较+将目标值进行排序;O(n^2) 执行超时
public List<Integer> findDisappearedNumbers(int[] nums) {
// 生成正确得数组
int[] newNums = new int[nums.length];
List<Integer> list = new ArrayList<>();
int num=1;
for (int i=0;i<nums.length;i++){
newNums[i]=num++;
}
// 排序
Arrays.sort(nums);
// 和正确数组进行比较(外循环是正确数组,内循环遍历目标数组)
for(int j=0;j<nums.length;j++){
for(int a=0;a<nums.length;a++){
if(nums[a]==newNums[j]){
break;
}
if(a==nums.length-1){
list.add(newNums[j]);
}
}
}
return list;
}
//解法二:使用额外空间hashMap,比较k和v O(n)超时,估计排序超时
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> list = new ArrayList<>();
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
map.put(i+1,nums[i]);
}
// key值就表示正确得
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
if(!map.containsValue(entry.getKey())){
list.add(entry.getKey());
}
}
return list;
}
// 解法三:巧妙利用下标和数值之间得关系 ,时间复杂度O(n)
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> results = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
// 这里要使用绝对值进行操作,这里数学函数abs绝对值
if (nums[Math.abs(nums[i]) - 1] > 0) {
nums[Math.abs(nums[i]) - 1] = - nums[Math.abs(nums[i]) - 1];
}
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
results.add(i + 1);
}
}
return results;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96242.html