[LeetCode] 41. First Missing Positive

缺失的第一个正数。题意是给一个未排序的整数数组,找出其中没有出现的最小的正整数。例子,

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

这题的思路有些类似桶排序,需要在对应的坐标上找到对应的数字,即数字i应该出现在坐标为i - 1的位置上,这样也能排除负数和大于数组长度的正数。 按照这个思路,需要扫描两遍,第一遍是将所有正整数放到他们应该去的位置上,第二遍再次扫描input的时候就能找出第一个缺失的正数了。

时间O(n)

空间O(1)

 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 };

猜你喜欢

转载自www.cnblogs.com/aaronliu1991/p/12425097.html