- 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/fi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 思路:如果i位置的值都满足i+1,下标0~(n-1),对应1~n上的值每一个都对应上,那么[1,n]范围内的值都出现在了数组nums上.要寻找不再数组nums的值,那么就有位置上的值不满足i位置是的值是i+1的规律.找出这些位置即可.
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> ans = new ArrayList<>();
if(nums == null || nums.length == 0) {
return ans;
}
int N = nums.length;
for(int i = 0; i < N; i++) {
// 从i位置出发 去玩下标循环怼
walk(nums,i);
}
for(int i = 0; i< N; i++) {
if(nums[i] != i + 1) {
ans.add(i + 1);
}
}
return ans;
}
public static void walk(int[] nums, int i) {
while(nums[i] != i + 1) {
int nexti = nums[i] - 1;
if(nums[nexti] == nexti + 1) {
break;
}
swap(nums,i,nexti);
}
}
public static void swap(int[] nums, int i ,int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
- javascript数组上有个includes方法
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function(nums) {
let len = nums.length,res = []
for(let i = 1; i <= len; i++){
if(!nums.includes(i)) res.push(i)
}
return res
};