【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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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