LeetCode精選TOP面試題268.缺失數字

題目回憶

給定一個包含 0, 1, 2, …, n 中 n 個數的序列,找出 0 … n 中沒有出現在序列中的那個數。

示例 1:
輸入: [3,0,1]
輸出: 2
示例 2:
輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8

算法應具有線性時間複雜度。考慮只使用額外常數空間來實現。

解題思路

  • 思路1:數學方法,簡單粗暴
    找缺失的數,那我把1,2,3,···,n的累加和求出來,再把數組的累加和求出來,做個差就好了;
  • 思路2:關係判斷
    判斷下標1~n的元素是否等於其前一個元素值+1,不是就說明缺失了前一個元素值+1所代表的這個數字;
  • 思路3:藉助哈希Set
    先把數組中的元素存入HashSet中,再遍歷整數序列0,1,2,···,n,當存在某個元素item不被HashSet包含時,就返回這個元素item。

代碼實現(Java)

import java.util.HashSet;
import java.util.Set;
/**
 * @author : flower48237
 * @2020/3/18 21:41
 * @title : LeetCode精選TOP面試題268.缺失數字
 */
public class Solution {
    public int missingNumber(int[] nums) {
        // 法 1
        int sum = 0;
        int stdsum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            stdsum += i + 1;
        }
        return stdsum - sum;

        // 法 2
        Arrays.sort(nums);
        // 判斷 n 是否出現在末位
        if (nums[nums.length-1] != nums.length) {
            return nums.length;
        }
        // 判斷 0 是否出現在首位
        else if (nums[0] != 0) {
            return 0;
        }
        // 此時缺失的數字一定在 (0, n) 中
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] != nums[i-1] + 1) {
                return nums[i-1] + 1;
            }
        }
        // 未缺失任何數字(保證函數有返回值)
        return -1;

        // 法 3
        Set<Integer> set = new HashSet<Integer>();
        for (int n : nums){
            set.add(n);
        }
        for (int i = 0; i <= nums.length; i++){
            if (!set.contains(i)){
                return i;
            }
        }
        return -1;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章