找到所有数组中消失的数字

题目链接

找到所有数组中消失的数字

题目描述

找到所有数组中消失的数字_第1张图片

注意点

  • 在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题

解答思路

  • 要想找到消失的数字需要使用哈希表,因为本题要在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题,而所有数字出现的范围为(1,n),所以可以直接使用数组作为哈希表存储数字是否在数组中出现过,具体方法是:第一次遍历根据nums[i]对应的数字x将其对应数组中下标相应值nums[x - 1]加上n,第二次遍历通过nums[i]的值不大于n的下标推出数组中消失的数字
  • 在根据数字x将其对应数组中下标相应值nums[x - 1]加上n时,此时x可能已经加上了n作为哈希表存储数字,所以需要将x - 1对n进行取模后再进行存储(因为数字可能重复出现,x可能为nums[i] + n * i,所以不能相减而是取模)

代码

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> res = new ArrayList<>();
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            int x = (nums[i] - 1) % n;
            nums[x] += n;
        }
        for (int i = 0; i < n; i++) {
            if (nums[i] <= n) {
                res.add(i + 1);
            }
        }
        return res;
    }
}

关键点

  • 以原数组作为哈希表存储在数组中出现的数字

你可能感兴趣的:(算法TOP100,leetcode,算法,数据结构,java)