題目描述
一個長度爲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
此時的算法時間度爲(二分法爲對數級別複雜度)、空間複雜度爲(幾個變量使用常數大小的額外空間)。
上面我是往左邊找,導致有點囉嗦,如果是往右邊找的話代碼如下:
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
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。