【LeetCode】面試題53 - II. 0~n-1中缺失的數字

題目描述

  一個長度爲n-1的遞增排序數組中的所有數字都是唯一的,並且每個數字都在範圍0~n-1之內。在範圍0~n-1內的n個數字中有且只有一個數字不在該數組中,請找出這個數字。

示例 1:

輸入: [0,1,3]
輸出: 2

示例 2:

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

限制

1 <= 數組長度 <= 10000

初步解題思路

  由於其給定數組是遞增排序好的,這道題目我一開始的想法就是,數組元素應該和其對應下標對應相等,如果不相等的話,那其對應下標這個數據就缺失了。如果所有元素都和其對應下標相等的話,那就是最後一個元素n-1缺失了,也就是nums這個輸入數組最後一個元素加1

Python實現

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        for i in range(len(nums)):
            if i != nums[i]:
                return i

        return nums[-1]+1

進階解題思路

Python實現

  排序數組中的搜索問題,首先想到 二分法解決

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        i = 0
        j = len(nums)-1
        while(i<j):
            m = (j+i)//2
            if nums[m] > m:
                j = m
            else:
                i = m+1
        if i == nums[-1]:
            return nums[-1]+1
        else:
            return i

  此時的算法時間度爲O(logN)O(logN)(二分法爲對數級別複雜度)、空間複雜度爲O(1)O(1)(幾個變量使用常數大小的額外空間)。

  上面我是往左邊找,導致有點囉嗦,如果是往右邊找的話代碼如下:

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        i = 0
        j = len(nums)-1
        while(i<=j):
            m = (j+i)//2
            if nums[m] == m:
                i = m+1
            else:
                j = m-1
        return i

  還有另闢蹊徑的(就是時間複雜度來說,要遍歷所有元素求和,並沒有比二分快。思路是很棒!):

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        n = len(nums)
        return (n+1)*n//2 - sum(nums) //總和減去數組和

C++實現

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int left = 0, right = nums.size()-1;
        
        while(left <= right){
            int mid = (left + right) / 2;
            if(nums[mid]==mid){
                left = mid +1;
            } else {
                right = mid-1;
            }
        }
        return left;
    }
};

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

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