LeetCode - 268. 丢失的数字

268. 丢失的数字

题目描述

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

进阶:

你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?

示例 1:

输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。
示例 2:

输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。
示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。
示例 4:

输入:nums = [0]
输出:1
解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

解题思路

排序

    /**
     * 排序
     * @param nums
     * @return
     */
    public int missingNumber_1(int[] nums) {
    
    
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
        int n = nums.length; // 2
        for (int i = 0; i < n; i++) {
    
    
            if (nums[i] == i){
    
    
                continue;
            }else {
    
    
                return i;
            }
        }
        return n;
    }

哈希表

  public int missingNumber_2(int[] nums){
    
    
        Set<Integer> numSet = new HashSet<Integer>();
        for (int num : nums) {
    
    
            numSet.add(num);
        }
        int expectedNumCount = nums.length + 1;
        for (int number = 0;number < expectedNumCount;number++){
    
    
            if (!numSet.contains(number)){
    
    
                return number;
            }
        }
        return -1;
    }

位运算

  /**
     * 位运算
     * @param nums
     * @return
     */
    public int missingNumber_3(int[] nums) {
    
    
        int missing = nums.length;
        for (int i = 0; i < nums.length; i++) {
    
    
            missing ^= i ^ nums[i]; //异或运算
        }
        return missing;
    }

数学

 public int missingNumber(int[] nums) {
    
    
        int expectedSum = nums.length*(nums.length + 1)/2;
        int actualSum = 0;
        for (int num : nums) actualSum += num;
        return expectedSum - actualSum;
    }

猜你喜欢

转载自blog.csdn.net/qq_35655602/article/details/115147386