LeetCode:缺失数字

222 阅读1分钟

一、题目描述

二、思路分析

分析

  1. 第一种想到的思路就是对数组排序。缺失的数组有三种情形,第一种是缺0,第二种是缺少中间的数字。第三种是缺n。其中第一种和第三种情形都很容易判断。第二种情形需要遍历数组,如果发现相邻数组元素 x 和 y 之间的差 y - x 是大于1的话,说明缺失了两者中间的数,记录,跳出循环。
  2. 第二种思路是借助 HashSet。首先把数组元素全部添加到 HashSet 中,然后看看 HashSet 中是否有0 ~ n-1 的数(HashSet 的查找效率是 O(1)级别的),如果没有则记录这个数,跳出循环。这里还需要注意缺失 n 的情况,一开始把返回结果初始化为 n 就好了。
  3. 第三种思路是高斯求和公式,如果忘记的同学可以去复习一下。求出 0 ~ n 的和 expected,再把数组的和求出来 actual,两者之差 expected - antual 即为缺失的数字。差为 0 说明是第一种情形,不为0说明是第二、第三种情形。

三、题解

  • 缺失数字的实现

    • 排序思路
    class Solution {
        public int missingNumber(int[] nums) {
            Arrays.sort(nums);
      	  // 第一种情形
            if (nums[0] != 0) {
                return 0;
            }
      	  // 第三种情形
            int result = nums.length;
            for (int i = 0; i < nums.length - 1; i++) {
                // 第二种情形
                if (nums[i + 1] - nums[i] > 1) {
                    result = nums[i] + 1;
                    break;
                }
            }
            return result;
        }
    }
    
    • HashSet
    class Solution {
      public int missingNumber(int[] nums) {
          HashSet<Integer> set = new HashSet();
          for (int num : nums) {
              set.add(num);
          }
    
          int result = nums.length;
          for (int i = 0; i < nums.length; i++) {
              if (!set.contains(i)) {
                  result = i;
                  break;
              }
          }
          return result; 
      }
    

}


* 高斯求和公式
```java
class Solution {
  public int missingNumber(int[] nums) {
      int expected = nums.length * (nums.length + 1) / 2;
      
      int actual = 0;
      for (int i = 0; i < nums.length; i++) {
          actual += nums[i];
      }
      return expected - actual;
  }
}