Description
Given an unsorted integer array, find the smallest missing positive integer.
Note:
Your algorithm should run in O(n) time and uses constant extra space.
Examples
Example 1:
Input: [1,2,0]
Output: 3
Example 2:
Input: [3,4,-1,1]
Output: 2
Example 3:
Input: [7,8,9,11,12]
Output: 1
解题思路
先说自己的吧……
搜到数组可以通过binarySearch的内置函数进行二分查找,所以就先把nums排序一下,然后一个个找呗……没找到就退出
嗯但是的确不是O(n)
class Solution {
public int firstMissingPositive(int[] nums) {
int i;
Arrays.sort(nums);
for(i = 1; i < nums.length + 1; i++)
if(Arrays.binarySearch(nums, i) < 0)
return i;
return i;
}
}
惯例摸摸solution
什么神仙算法QuQ
总结一下就是用 index 来体现已有的num
总体流程是这样的
- 循环所有的number
- 得到当前number的绝对值num
- 然后对 nums[num] 做取负操作,也就是说,如果这个数是负数,就意味着这个index所代表的值包含在整个nums序列里面
- 重新循环,找到第一个不是负数的数的index,这就意味着这个index不包含在nums之中,那返回index++就返回第一个不存在的非负整数啦!
class Solution {
public int firstMissingPositive(int[] nums) {
int i;
int length = nums.length;
for(i = 0; i < nums.length; i++){
if(nums[i] <= 0)
nums[i] = length + 1;
}
for(i = 0; i < nums.length; i++){
int a = Math.abs(nums[i]);
if(a - 1 < length)
nums[a - 1] = Math.abs(nums[a - 1]) * (-1);
}
for(i = 0; i < nums.length; i++){
if(nums[i] > 0)
break;
}
return i + 1;
}
}