leetcode第41题 缺失的第一个正数

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

困难题,不会做。

class Solution {
    public int firstMissingPositive(int[] nums) {
    int n = nums.length ; 
    
    for(int i = 0 ; i < n ; i ++){
        if(nums[i]<=0){
            nums[i] = n + 1 ;
        }
    }

    for(int i = 0 ; i < n ; i ++){
        int num = Math.abs(nums[i]);
        if(num <= n ){
            nums[num-1] = - Math.abs(nums[num-1]);
        }
    }
    for(int i = 0 ; i < n ; i ++){
        if(nums[i]>0){
            return i + 1 ;
        }
    }
    return n + 1 ;

    }
}

第一种方法思路:
1,先把所有不再【1,n】区间的数,设置为n+1
2,遍历数组,把绝对值小于n的数,所对应的位置上的数变成负数(无论是多少,变成负的,即可)
3,找到第一个不是负数的位置,然后加1.
评价,非常巧妙。相当于为每个1,n范围内的数进行了负数的标记。

第二种方法:

class Solution {
    public int firstMissingPositive(int[] nums) {
    int n = nums.length ; 
    for(int i = 0 ; i < n ; i ++){
        while(nums[i]>0 && nums[i] <= n && nums[nums[i]-1] != nums[i]){
           int temp = nums[i] ;
           nums[i] = nums[nums[i]-1] ;
           nums[temp-1] = temp ;
         //  int temp = nums[nums[i]-1] ;
         // nums[nums[i]-1] = nums[i] ;
         //  nums[i] = temp;         
        }
    }
    for(int i = 0 ; i < n ; i ++){
        if(nums[i]!=i+1){
            return i + 1 ;
        }
    }
    return n + 1 ;

    }
}

思路:把每个【1,n】之间的数放到他应该在的地方(3就放在2号位)
1,把每个在【1,n】之间的数,放在其对应的位置上。
2,找到第一个nums[i] != i +1 的数。就是那个最小值。

两种方法,都是应用的自身数组,一个进行标记,一个进行置换。

关键的点没有想到。就是长度为n的数组,最大的结果也就是n+1不可能更大了。
否则就应该在【1,n】之间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值