这个题目还是有点复杂的,主要在于时间复杂度要求O(n),空间复杂度要求O(1)。因此常规的思路都不行,最后还是看了题解才知道咋做。
- 首先要明白缺失第一个正整数要么是1-n,要么是n+1,其中n是nums数组的长度。这是很容易理解的,因为当nums数组里存放的就是1-n,那么最小正整数就是n+1,如果数组中有大于等于1个元素不在范围1-n中,则缺失的最小正整数就是1-n之间的某个值。
- 遍历该数组,如果nums[i]元素是在1-n范围间的话,就存在数组的nums[i]下标处。也就是令nums[nums[i]]=nums[i],当然这样操作时要把原来nums[nums[i]]中的元素放到nums[i]的位置去。如此遍历一遍就整理好数组了。有一个小技巧就是把nums扩容一个元素,这样下标和num[i]的值就可以直接对应了。
- 整理好数组后遍历一遍,如果nums[i]是在1-n范围内的就遍历下一个,否则直接返回下标i即可,如果nums数组整理后第1-n个元素刚好是1-n,则返回n+1.
代码如下:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型
#
class Solution:
def minNumberDisappeared(self , nums) -> int:
# write code here
nums.append(-1) # 将nuns数组扩充到长度n+1
i = 0
while i <= len(nums)-1:
if nums[i]>=1 and nums[i] <= len(nums)-1:
a , b = nums[nums[i]] , nums[i]
nums[nums[i]] = b
nums[i] = a
if i == nums[i]:
i+=1
else:
i+=1
for i in range(1,len(nums)):
if nums[i]<1 or nums[i]>=len(nums):
return i
return len(nums)
nums=[1,0,2]
print(Solution().minNumberDisappeared(nums))