题解 | #缺失的第一个正整数#哈希+数学策略

缺失的第一个正整数

http://www.nowcoder.com/practice/50ec6a5b0e4e45348544348278cdcee5

    /*public int minNumberDisappeared (int[] nums) {
        HashSet<Integer> isFind = new HashSet<>();
        //当前没出现最小的是1,碰到1就往上看看2出现过没有
        int curMinPositive = 1;
        for(int num:nums){
            isFind.add(num);
            if(num==curMinPositive){
                //循环查看下一个没出现过的是谁
                while(isFind.contains(curMinPositive)){
                    curMinPositive++;
                }
            }
        }
        return curMinPositive;
        
    }*/
    //nums的长度为n,在最整齐的情况下nums里的元素应该是[1....n],那么缺失的第一个正整数就是n+1
    //如果不是这样,那么缺失的第一个正整数肯定是在[1...n]之中,如何找到这个缺的呢?
    //将nums中属于[1...n]的数对应的下标,比如说2,就在序号为2,也就是下标为1的地方做一个标记
    //如果nums中所有位置都有标记,那么结果就是n+1,否则第一个没有标记的序号就是缺失的正整数
    //标记怎么做?设计为什么?设计成那个数的相反数最好了,这样不管是那个下标是否处理过,只要是我们都面对
    //绝对值来操作就不会有问题,而若是设计成别的数,比如-1就会顶掉那个下标的数,就会复杂化了。
    public int minNumberDisappeared (int[] nums) {
        if(nums==null||nums.length==0) return 1;
        int N = nums.length;
        //1.负数和0变成n+1
        for(int i = 0;i<N;i++){
            if(nums[i]<=0){
                nums[i] = N+1;
            }
        }
        //2.绝对值<=N的对应下标变成相反数
        for(int i = 0;i<N;i++){
            int cur = Math.abs(nums[i]);
            if(cur<=N){
                nums[cur-1] = nums[cur-1]<0?nums[cur-1]:-nums[cur-1];
            }
        }
        //3.遍历找到第一个非负的序号,那就是缺的
        for(int i = 0;i<N;i++){
            if(nums[i]>=0){
                return i+1;
            }
        }
        return N+1;
    }
waigo的刷题之路 文章被收录于专栏

收录平时刷题的题解

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务