zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    首用虚拟机
    20145339《信息安全系统设计基础》第5周学习总结
    试编hello world
    第二章半复习
    第一章半复习
    20145339《信息安全系统设计基础》第3周学习总结
    20145339《信息安全系统设计基础》第2周学习总结
    20145339《信息安全系统设计基础》第一周学习总结
    20145339顿珠达杰 《信息安全系统设计基础》第0周学习总结
    第16周课程总结
  • 原文地址:https://www.cnblogs.com/cold-windy/p/11724058.html
Copyright © 2011-2022 走看看