LeetCode 面试题 17.19. 消失的两个数字(java实现)

面试题 17.19. 消失的两个数字

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?

以任意顺序返回这两个数字均可。

示例 1:

输入: [1]
输出: [2,3]

示例 2:

输入: [2,3]
输出: [1,4]

提示:

  • nums.length <= 30000

解答思路:

  • 1.从1到N的数组nums,缺失了两个元素,那么N=nums.length+2
  • 2.缺失的两个数字的和sumOfTwo = sum(1…N)-sum(nums)
  • 3.记住ave=sumOfTwo/2.因为缺失的两个数字不相等,所以一个小于等于ave,一个大于等于ave
  • 4.只对小于等于ave的元素求和,得到第一个缺失数字为sum(1…ave)-sum(nums中,小于等于ave的元素)
  • 5.第二个缺失的数字:sumOfTwo减去第一个缺失的数字
class Solution {
    
    
    /*
        1.从1到N的数组nums,缺失了两个元素,那么N=nums.length+2
        2.缺失的两个数字的和sumOfTwo = sum(1...N)-sum(nums)
        3.记住ave=sumOfTwo/2.因为缺失的两个数字不相等,所以一个小于等于ave,一个大于等于ave
        4.只对小于等于ave的元素求和,得到第一个缺失数字
            sum(1..ave)-sum(nums中,小于等于ave的元素)
        5.第二个缺失的数字:sumOfTwo-第一个缺失的数字
    */
    public int[] missingTwo(int[] nums) {
    
    
        int sum = 0;
        for(int i=0;i<nums.length;i++){
    
    
            sum=sum+nums[i];//将原数组中所有数字求和
        }
        //int n = nums.length+2;             //数字1到n等差数列求和为(n+1)n/2
        int sumOfTwo = (nums.length+2+1)*(nums.length+2)/2 - sum;//找到那俩个缺失数字的和
        int aveOfTwo = sumOfTwo/2;         //计算缺失两个缺失数字的平均和aveOfTwo
        sum = 0;
        for(int i=0;i<nums.length;i++){
    
    //这里判断条件写成i<nums.length&&nums[i]<=aveOfTwo会有问题?????
                if(nums[i]<=aveOfTwo){
    
    
                    sum=sum+nums[i];    //再对数组中小于等于aveOfTwo数组进行求和
                }
        }
        int []arr = new int[2];          //创建大小为2的数组arr
        arr[0] = (aveOfTwo+1)*aveOfTwo/2 - sum;//缺失数字中较小的数字smallNum = sum(1..aveOfTwo)-sum(nums中小于aveOfTwo的数字),并将其放入a[0]中
        arr[1] = sumOfTwo - arr[0];         //较大的数字=sumOfTwo-arr[0]
        return arr;         //最后返回数组arr即可
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44243059/article/details/126073689