题目描述
一个长度为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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。