Leetcode 41-First Missing Positive

题目:

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

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。



    最近项目忙,难得有心情抽空刷一题Leetcode(发现还是一题困难= =,脑阔疼)。

  

思路:

    这个题目有点蛋疼,卡了我挺久的。一开始想进行各种边界判断,发现太复杂了。小小参考了一下别人的思路,嗯嗯,恍然大悟。。

    运用到的方法有点类似木桶法,将nums[i]的值放在i-1的位置(也就是说1放在0的位置,2放在1的位置,当查询到nums[i]!=i-1的时候,这个数就是缺失的)。很巧妙,学到了。

    贴上代码:

  

public class Solution {  
    public int firstMissingPositive(int[] nums) {  
        if(nums.length == 0)  
            return 1;  
        //第i位存放i+1的数值  
        for(int i = 0; i < nums.length;i++){  
            if(nums[i] > 0){
                
                while(nums[i] > 0 && nums[i] < i+1  &&nums[i] != nums[nums[i] -1]){  //小于i+1是为了超出数组边界
                    int temp = nums[nums[i]-1];//交换数据  
                    nums[nums[i]-1] = nums[i];  
                    nums[i] = temp;  
                }  
            }  
        }  
        //循环寻找不符合要求的数据,返回  
        for(int i = 0; i < nums.length;i++){  
            if(nums[i] != i+1){  
                return i+1;  
            }  
        }  
        return nums.length + 1;  
    }  
}  

    只有while的循环条件可以具体说一下,nums[i]>0和nums[i]!=nums[nums[i]-1]就没什么好说了,小于0或者相等的时候就不用调这个方法了,直接跳过。num[i]<i+1,是为了控制当前数只能向前交换,防止数组超边界。

结果如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值