1. 程式人生 > >LeetCode 41. 缺失的第一個正數(First Missing Positive)

LeetCode 41. 缺失的第一個正數(First Missing Positive)

style 第一個 交換 ret etc 沒有 解題思路 ssi !=

題目描述

給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。

示例 1:

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

示例 2:

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

示例 3:

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

說明:

你的算法的時間復雜度應為O(n),並且只能使用常數級別的空間。

解題思路

本題讓只能使用常數級別的空間,所以哈希的解法只能放棄了。考慮另一種思路,把數字依次放到他們對應的位置上,比如1放到第一個(數組第0個)位置上,2放到第二個(數組第1個)位置上,通過交換可得到,若該位置上的數不是正數或者大於數組的長度就跳過。這樣調整完整個數組後,再從數組首位置開始判斷,若對應位置上的數錯誤就返回該位置,若都擺放正確,就返回數組長度加1.

代碼

 1 class Solution {
 2 public:
 3     int firstMissingPositive(vector<int>& nums) {
 4         int i = 0;
 5         while(i < nums.size()){
 6             while(nums[i] > 0 && nums[i] <= nums.size() && nums[i] != i + 1 && nums[i] != nums[nums[i] - 1
]) 7 swap(nums[i], nums[nums[i] - 1]); 8 i++; 9 } 10 for(int i = 0; i < nums.size(); i++) 11 if(nums[i] != i + 1) 12 return i + 1; 13 return nums.size() + 1; 14 } 15 };

LeetCode 41. 缺失的第一個正數(First Missing Positive)