标签:n+1 ++ first void pos 遍历 positive ssi gpo
leetcode第41题,缺失的第一个正数
对于这道题,利用的是桶排序的思想,桶排序也就是利用数组的下标和值对应的关系,也就是说下标为0的索引对应的值应该就是0,依次类推n对应n
但是这只是一种对应关系,也就是说我们不仅仅只局限于这种关系,只要有合理的对应关系即可,那么这题要求从1开始第一个没有的正整数。所以我们将下标0对应1
n-1对应n。
考虑正整数最小为1,也就是不能缺少1否则答案直接就是1,而且数组长度为n,那么也就是说一共才有n个数,又要求从1开始,所以结果应该在[1,n+1]这个区间之间
我们是想一下极端情况,也就是说数组就是连续的且从1开始,那么我们从最小开始遍历得到的结果就是最后的n+1,
所以进一步考虑在排序的时候每一个空间不能浪费,也就是0是最小的,那么就对应1。
遍历数组,如果这个数小于等于0直接跳过,如果大于n也跳过。
如果这个数大于0也小于等于n,但是这个数不在它应该在的位置,也就是比如说,在索引3有一个1,那么这个1应该在0这个索引的位置,所以我们需要将0索引的值和这个3索引的值交换一下,同时我们交换来的这个值,我们还没有判断这个值的情况,也就是说不能直接跳过它去下一个位置,此时我们需要i--,(这个地方的处理就是在快排的时候对应大于v的时候交换位置时候的处理)
在交换完成之后,也就是数组遍历完成,我们再次遍历数组寻找那个缺失的正整数,如果发现下标为i的地方的值不为i+1,那么结果就是i+1是缺失的了,直接返回这个值即可,如果遍历到尾还没有找到,说明这个数组排好序以后是一个有序的连续的数组,那么我们在这个循环的外面直接返回一个n+1即可。
下面是代码:
1 class Solution { 2 public int firstMissingPositive(int[] nums) { 3 int n=nums.length; 4 for(int i=0;i<n;i++) 5 { 6 if(nums[i]>0&&nums[i]<=n&&nums[nums[i]-1]!=nums[i]) 7 { 8 swap(nums,i,nums[i]-1); 9 i--; 10 } 11 } 12 for(int i=0;i<n;i++) 13 { 14 if(nums[i]!=i+1) 15 return i+1; 16 } 17 return n+1; 18 } 19 public void swap(int[] arr,int l,int r){ 20 int temp=arr[l]; 21 arr[l]=arr[r]; 22 arr[r]=temp; 23 } 24 }
标签:n+1 ++ first void pos 遍历 positive ssi gpo
原文地址:https://www.cnblogs.com/cold-windy/p/11724058.html