Given an unsorted integer array nums
, find the smallest missing positive integer.
Example 1:
Input: nums = [1,2,0] Output: 3
Example 2:
Input: nums = [3,4,-1,1] Output: 2
Example 3:
Input: nums = [7,8,9,11,12] Output: 1
Constraints:
0 <= nums.length <= 300
-231 <= nums[i] <= 231 - 1
Follow up: Could you implement an algorithm that runs in O(n)
time and uses constant extra space?
缺失的第一个正数。
题意是给一个未排序的整数数组,找出其中没有出现的最小的正整数。
这题的思路有些类似桶排序/抽屉原理,需要在对应的坐标上找到对应的数字,即数字i应该出现在坐标为i - 1的位置上,这样也能排除负数和大于数组长度的正数。 按照这个思路,需要扫描两遍,第一遍是将所有正整数放到他们应该去的位置上,第二遍再次扫描input的时候就能找出第一个缺失的正数了。
时间O(n) - 题目要求
空间O(1) - 题目要求
JavaScript实现
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var firstMissingPositive = function (nums) { 6 // corner case 7 if (nums === null || nums.length === 0) return 1; 8 9 // normal case 10 for (let i = 0; i < nums.length; i++) { 11 while (nums[i] > 0 && nums[i] < nums.length && nums[nums[i] - 1] !== nums[i]) { 12 let temp = nums[nums[i] - 1]; 13 nums[nums[i] - 1] = nums[i]; 14 nums[i] = temp; 15 } 16 } 17 18 // double check 19 for (let i = 0; i < nums.length; i++) { 20 if (nums[i] !== i + 1) { 21 return i + 1; 22 } 23 } 24 return nums.length + 1; 25 };
Java实现
1 class Solution { 2 public int firstMissingPositive(int[] nums) { 3 // corner case 4 if (nums == null || nums.length == 0) { 5 return 1; 6 } 7 8 // normal case 9 for (int i = 0; i < nums.length; i++) { 10 // 如果swap的动作按照注释中的部分写 11 // 一定要把nums[nums[i] - 1]先赋值给temp,否则如下的case是会越界的 12 // [3, 4, -1, 1] 13 while (nums[i] > 0 && nums[i] < nums.length && nums[nums[i] - 1] != nums[i]) { 14 // int temp = nums[nums[i] - 1]; 15 // nums[nums[i] - 1] = nums[i]; 16 // nums[i] = temp; 17 swap(nums, i, nums[i] - 1); 18 } 19 } 20 21 // double check 22 for (int i = 0; i < nums.length; i++) { 23 if (nums[i] != i + 1) { 24 return i + 1; 25 } 26 } 27 return nums.length + 1; 28 } 29 30 private void swap(int[] nums, int i, int j) { 31 int tmp = nums[i]; 32 nums[i] = nums[j]; 33 nums[j] = tmp; 34 } 35 }
相关题目
442. Find All Duplicates in an Array