268J. Missing Number

https://leetcode.com/problems/missing-number/

Method Good:

这个题可以转化为 041 041 是找消失的最大正整数。 那么这个题一样,用同样的代码,变成寻找消失的最大正整数, 如果找不到,那么说明消失的是0.

class Solution {
    public int missingNumber(int[] nums) {
        int N = nums.length;
        for(int i = 0; i < N; i++){
            if(nums[i] <= 0 || nums[i] > N) {
                nums[i] = N + 1;
            }
        }
        for(int i = 0; i < N; i++){
            int num = Math.abs(nums[i]); 
            if(num > N ) continue;
            num --;
            if( nums[num] > 0){
                nums[num] *= -1;
            }    
        }
        
        for(int i = 0; i < N; i++){
            if(nums[i] >= 0){
                return i + 1;
            }
        }
        return 0;
    }
}

Method Best 之 位运算

假设没有 missing element, 那么就是 n + 1 个 index 和 n + 1 个数。 index : from 0 to n. nums : from 0 to n. 原则上 0 = all indices 两两^ all nums 由于现在存在 missing element 一共有应有 n + 1 个数,和 n 个 index, 利用 a^a = 0。那么只有missing element 找不到跟它配对的 index。

class Solution {
    public int missingNumber(int[] nums) {
        int missing = nums.length;
        for(int i = 0; i < nums.length; i++){
            missing^=nums[i];
            missing^=i;
        }
        return missing;
    }
}

Method Best 之 改写方法1

https://leetcode.com/problems/missing-number/discuss/69961/Share-four-different-solutions

高斯求和公式

前 n 项是 n*(n + 1)/2. 直接用 n*(n + 1)/2 - array sum = missing element 高斯求和公式不如位运算的原因是,有可能 Integer Overflow

Last updated

Was this helpful?