[LeetCode]题解(python):041-First Missing Positive

本文介绍了一种高效解决LeetCode上寻找数组中第一个缺失的正数问题的方法。通过巧妙的桶排序扩展思想,在O(n)的时间复杂度和O(1)的空间复杂度下实现了这一目标。文章附带了详细的Python实现代码。
摘要由CSDN通过智能技术生成

题目来源:

  https://leetcode.com/problems/first-missing-positive/


 

题意分析:

  题目给出定一个数组nums,输出第一个缺失的正数。要求时间复杂度为O(n),空间复杂度是O(1).


 

题目思路:

  这题是个人觉得是很难的题目,我想了好久都没有想到怎么做。根据网上的答案才做出来的。这个是一个桶排序的扩展。具体的思想就是把对应的数放到对应的位置,比如第一个数放1,第i个数放i+1.具体做法是,从数组第一个数开始,如果这个数不满足nums[i] == i + 1,那么他和第nums[i + 1]上的数互换,直到nums[i] == i +1 或者他小于等于0或者他大于数组的长度。由于每换一次,至少有一个位置满足nums[i] = i + 1。所以最多要换n次,所以时间复杂度是(O(n))。由于没有用额外的空间,那么满足题目要求。


 

代码(python):

  

 1 class Solution(object):
 2     def firstMissingPositive(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: int
 6         """
 7         size = len(nums)
 8         i = 0
 9         while i < size:
10             if nums[i] != i + 1 and nums[i] > 0 and nums[i] <= size and nums[i] != nums[nums[i] - 1]:
11                 tmp = nums[i] - 1
12                 nums[i],nums[tmp] = nums[tmp],nums[i]
13             else:
14                 i += 1
15         for i in range(size):
16             if nums[i] != i + 1:
17                 return i + 1
18         return size + 1
View Code

 


 

转载请注明出处:http://www.cnblogs.com/chruny/p/4934279.html

转载于:https://www.cnblogs.com/chruny/p/4934279.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值