448. 找到所有数组中消失的数字
题目:给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
解题方法1 原地hash
1、分析:注意到 nums 的长度恰好也为 n,让 nums 充当哈希表
2、算法
(1) 把正确的数组值放在正确的位置
(2) 循环遍历,把下标值不对的元素的 下标+1 后加入新数组返回
3、java代码
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
int len =nums.length;
int index=0;
while (index<len){
//判断nums[i]是否正确,即nums[i]等于下标i加1
if (nums[index] == index + 1) {
index++; //正确:判断下一个nums[i]
} else {
//每一个数组值-1等于正确下标值
int targetindex = nums[index]-1;
//如果实际下标的数组值 = 正确下标的数组值,则数组值重复 或者位置正确,跳过
if (nums[index] == nums[targetindex]) {
index++;
continue;
}
//如果位置不正确:换位
int temp= nums[targetindex];
nums[targetindex] = nums[index];
nums[index] = temp;
}
}
//ArrayList 类是一个可以动态修改的数组
//循环遍历,把下标值不对的元素的 下标+1 后加入新数组ret
List<Integer> ret = new ArrayList<Integer>();
for (int i = 0; i < len; i++) {
if (nums[i] != i+1) {
ret.add(i + 1);
}
}
return ret;
}
}