题解 | #缺失的第一个正整数#

缺失的第一个正整数

http://www.nowcoder.com/practice/50ec6a5b0e4e45348544348278cdcee5

这个题目还是有点复杂的,主要在于时间复杂度要求O(n),空间复杂度要求O(1)。因此常规的思路都不行,最后还是看了题解才知道咋做。

  1. 首先要明白缺失第一个正整数要么是1-n,要么是n+1,其中n是nums数组的长度。这是很容易理解的,因为当nums数组里存放的就是1-n,那么最小正整数就是n+1,如果数组中有大于等于1个元素不在范围1-n中,则缺失的最小正整数就是1-n之间的某个值。
  2. 遍历该数组,如果nums[i]元素是在1-n范围间的话,就存在数组的nums[i]下标处。也就是令nums[nums[i]]=nums[i],当然这样操作时要把原来nums[nums[i]]中的元素放到nums[i]的位置去。如此遍历一遍就整理好数组了。有一个小技巧就是把nums扩容一个元素,这样下标和num[i]的值就可以直接对应了。
  3. 整理好数组后遍历一遍,如果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))

全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务