阿里云网站主体变更怎么做,上首页seo,500云网站,网站防护找谁做1. 题目大意
给你一个未排序的整数数组 nums #xff0c;请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
2. 思路分析
示例 1#xff1a;
输入#xff1a;nums [3,4,-1,1]
输出#xff1a;2
解释#xff1…1. 题目大意
给你一个未排序的整数数组 nums 请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
2. 思路分析
示例 1
输入nums [3,4,-1,1]
输出2
解释1 在数组中但 2 没有。根据示例对于一个长度为 N 的数组其中没有出现的最小正整数只能在[1, N1]中。这是因为如果[1, N]都出现了那么答案是N1否则答案是 [1, N]中没有出现的最小正整数。
题目又要求我们不能使用额外空间所以我们直接对原数组进行操作。因为我们只需要关注数组中[1, N]之间的数所以可以把值i, 置换到数组对应下标的位置得到nums[i-1] i。这里忽略0 N的值。
上面提到过程中本质上涉及元组两个元素的交换如果nums[i-1] ! i则需要反复执行上面的流程。示例1变换流程
arrayindex说明[3, 4, -1, 1]0[-1, 4, 3, 1]0首先交换3和-1,虽然nums[0]!1但是出现负值接着往前走[-1, 1, 3, 4]1置换1和4[1, -1, 3, 4]1因为nums[1] ! 2, 所以继续置换,使得nums[0] 1[1, -1, 3, 4]2nums[2] 3继续[1, -1, 3, 4]2nums[3] 4结束
最后我们只需要查找置换后数组中nums[i] ! i-1的情况如果数组中都没有出现上述情况则直接返回N1。
3. 代码示例
Java版本
class Solution {public int firstMissingPositive(int[] nums) {for(int i0; inums.length; i){while(nums[i] 0 nums[i] nums.length nums[i] ! i1 nums[i] ! nums[nums[i]-1]){ // nums[i] ! nums[nums[i]-1]避免数组中有值重复的情况int n nums[i]-1;int tmp nums[n];nums[n] nums[i];nums[i] tmp;}}System.out.println(Arrays.toString(nums));for(int i0; inums.length; i){if(nums[i] ! (i1) || nums[i] 0)return i1;}return nums.length1;}
}Python版本
class Solution:def firstMissingPositive(self, nums: List[int]) - int:l len(nums)if l 0:return 1for i in range(l):while(1 nums[i] l and nums[i] ! i1 and nums[i] ! nums[nums[i] - 1]):# nums[nums[i] - 1], nums[i] nums[i], nums[nums[i] - 1]for i in range(l):if nums[i] ! i1:return i1return l1在上述的while循环中nums[i] ! nums[nums[i]-1]是为了避免数组中有值重复的情况如果不加出处理就会一直被置换陷入死循环。