力扣刷题日记-448. 找到所有数组中消失的数字

57 阅读1分钟
  • 给你一个含 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 
};