twrp3.3.0刷n9002_leetcode 41. 缺失的第一个正数每天刷一道leetcode算法系列!

b200bc11392f3d03f0e40b70bf16822e.png

作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人

前文回顾:

leetcode1. 两数之和--每天刷一道leetcode系列

leetcode2. 两数相加--每天刷一道leetcode系列!

leetcode3. 无重复字符的最长子串--每天刷一道leetcode系列!

leetcode4. 寻找两个有序数组的中位数--每天刷一道leetcode系列!

leetcode5.最长回文子串--每天刷一道leetcode系列!

leetcode9. 回文数--每天刷一道leetcode系列!

leetcode11. 盛最多水的容器--每天刷一道leetcode系列!

leetcode14. 最长公共前缀--每天刷一道leetcode算法题系列!

leetcode15. 三数之和--每天刷一道leetcode算法系列!

leetcode16. 最接近的三数之和--每天刷一道leetcode算法系列!

leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!

leetcode18. 四数之和--每天刷一道leetcode算法系列!

leetcode19. 删除链表的倒数第N个节点--每天刷一道leetcode算法系列!

leetcode20. 括号生成--每天刷一道leetcode算法系列!

leetcode21. 合并两个有序链表--每天刷一道leetcode算法系列!

leetcode22. 括号生成--每天刷一道leetcode算法系列!

leetcode23. 合并K个排序链表--每天刷一道leetcode算法系列!

leetcode24. 两两交换链表中的节点--每天刷一道leetcode算法系列!

leetcode25. K个一组翻转链表--每天刷一道leetcode算法系列!

leetcode26. 删除排序数组中的重复项--每天刷一道leetcode算法系列!

leetcode27. 移除元素--每天刷一道leetcode算法系列!

leetcode32. 最长有效括号--每天刷一道leetcode算法系列!

leetcode33. 搜索旋转排序数组--每天刷一道leetcode算法系列!

leetcode34. 在排序数组中查找元素的第一个和最后一个位置--每天刷一道leetcode算法系列!

leetcode 35. 搜索插入位置--每天刷一道leetcode算法系列!

leetcode 39. 组合总和--每天刷一道leetcode算法系列!

leetcode 41. 缺失的第一个正数--每天刷一道leetcode算法系列!(本篇)

题目描述

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

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

示例 2:

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

示例 3:

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

分析

以[3,5,-1,1]为例,整个过程分两步
第一步:将数据放到他本来应该在的位置,即nums[i]=i+1,
   1、对于 nums[0] = 3,需要将其放到第三个位置,即nums[2]的位置,因此调换nums[0]和nums[2],数组变为[-1,5,3,1]。
   然后nums[0] = -1,我们最后需要找的是缺失的第一个正数,因此-1这种可以直接舍弃,本轮循环结束,进入下一轮。
   2、对于nums[1] = 5,因为数组的长度为4,因此,缺失的第一个正整数肯定小于5,因此5这种可以直接舍弃,本轮循环结束,进入下一轮。
   3、对于nums[2] = 3,这个位置不需要进行调换,因为3现在正好在第三个位置,不需要调换。
   4、对于nums[3] = 1,需要将其放到第一个位置,即nums[0]的位置,因此调换nums[0]和nums[3],数组变为[1,5,3,-1]。
 第二步:遍历数组,如果哪个位置nums[i]!=i+1,则他就是缺失的数。很明显[1,5,3,-1]缺失的第一个正整数为2

代码

public int firstMissingPositive(int[] nums) {
        if(nums == null || nums.length == 0){
            return 1;
        }
        int len = nums.length;
        for (int i = 0; i             while (nums[i] >0 && nums[i] <= len && nums[i]!=nums[nums[i]-1]){
                swap(nums,i,nums[i]-1);
            }
        }
        int i = 0;

        for (; i             if(nums[i] != i+1){
                break;
            }
        }

        return i+1;
    }

    private void swap(int[] nums,int i, int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

长按订阅更多面经分享

f7573886b0ee4c97a38c484fb5c5830a.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值