缺失的第一个正数
题目
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
思路
整个的思路就是把nums[i]存储的数放到,下标为nums[i]的位置,处理小于等于0和大于数组长度的nums[i],交换nums[i]到下标nums[i]是做一下取负值处理,离开的位置i不做处理,把整个数组处理一遍后,遍历数组找到第一个正数所对应的位置,就是第一个缺失的正数。
- 和剑指offer中3. 数组中重复中的数字差不多,数组存储的数(长度范围内)放在对应下标的位置,离开的位置保持不变,如果没有人填回来说明这个位置空缺,这是只要遍历一次数组,找到第一个空缺的位置就是第一个缺失的正数。
- 缺失的位置巧妙的用数组的0、1来辅助,先判断是否有1,如果有1那这个位置就可以拿出来放 数组中存储的不在长度范围内的数,把这些数置为1,
- 如果说这个数离开现在的位置,到nums[i]的位置(比如数组长度6, i = 3, nums[i] = 4, nums[i]去填到i = 4的位置),把这个数变成负数,所以这种方法,最后统计有多少正数,还能统计在数组范围内缺失多少正数。
java代码
1 |
|
总结
- O(2n)的意思是遍历两遍!!!
- 本题思路借鉴了剑指Offer3. 重复的数字,请复习
- 犯了两个错误1. // foreach语句出错,错成nums[i] == 1 2. // n == 2判断出错
- 可以看本题的思路