41. 缺失的第一个正数

Posted 小路不会迷路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了41. 缺失的第一个正数相关的知识,希望对你有一定的参考价值。

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 }

 

以上是关于41. 缺失的第一个正数的主要内容,如果未能解决你的问题,请参考以下文章

41. 缺失的第一个正数

41. 缺失的第一个正数

41. 缺失的第一个正数(On)

LeetCode:缺失的第一个正数41

41. 缺失的第一个正数

[LeetCode 41.] 缺失的第一个正数