LeetCode 41 确实的第一个正数

1.看别人的,感觉这个题怪怪的

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

有两个要注意的地方,

1.while 这里如果这个位置i没有,一开始没理解这个while,后来试了一下

举个例子,假如初始数据为 3 4 -1 1

i=0时 3 4 -1 1 --> -1 4 3 1 此时-1不满足while条件,跳出循环

i=1是 -1 4 3 1 --> -1 1 3 4 此时,其实1还是没到自己的位置,所以需要while循环

nums[i]>0 && nums[i] <= nums.length在这里代表着,这个范围外的数字其实不用理会,

这个范围内且  这个nums[i] != nums[nums[i]-1]  意味着 在这里就是看1本来应该待得位置是不是1 

是,就跳出while   不是,就和现在那个位置上的-1换

2.最后的return也是两种情况的总和

     i走到最后了,就说明 这个最小的正数是长度+1

     i没有走到最后,就说明 就是这个位置上的数=i+1

3.最开始我还写错一个地方,就是while里面的条件nums[i] != nums[nums[i]-1]  我写错的是nums[i] != i+1

这个时候报错的数据是 [1,1]     这种情况下,在i=1时,就跳不出while循环了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值