1. 程式人生 > >LeetCode0268.缺失數字

LeetCode0268.缺失數字

268缺失數字-陣列

描述

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

例項

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

說明

你的演算法應具有線性時間複雜度。你能否僅使用額外常數空間來實現?

題解

本題最簡單的思路就是直接把所有已有的元素都放到一個地方,再一一檢查.下面是我的程式碼

static public int missingNumber(int[] nums) {
    HashSet<Integer> hashSet = new HashSet<
>(); for (int i = 0; i < nums.length; i++) { hashSet.add(nums[i]); } for (int i = 0; i <= nums.length; i++) { if (hashSet.add(i)){ return i; } } return 0; }

不過使用到了HashSet,速度不夠快,如果使用陣列更好.

class Solution {
    public int missingNumber(int
[] nums) { if(nums == null || nums.length == 0) { return 0; } int length = nums.length; int[] newNums = new int[length + 1]; for(int num : nums) { newNums[num] = 1; } for(int i = 0; i < newNums.length; i++) { if(newNums[i] == 0) { return
i; } } return 0; } }

上述兩個程式碼都滿足了O(n)的時間複雜度,但是對於常數級別的額外空間沒有滿足.有一種解法是將上述所有元素求和,再與sum(0~n)進行比較,差值就是缺少的數值…效率又高,空間又省…

int missingNumber(vector<int>& nums) {
        int sum = 0, n = nums.size();
        for (auto &a : nums) {
            sum += a;
        }
        return 0.5 * n * (n + 1) - sum;
    }

第一第二種是常規做法,第三種不強求,但需要有這樣的比較意識.