码迷,mamicode.com
首页 > 其他好文 > 详细

41. 缺失的第一个正数

时间:2019-10-23 09:17:16      阅读:95      评论:0      收藏:0      [点我收藏+]

标签: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 }

 

41. 缺失的第一个正数

标签:n+1   ++   first   void   pos   遍历   positive   ssi   gpo   

原文地址:https://www.cnblogs.com/cold-windy/p/11724058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!