1. 程式人生 > >Leetcode 41.缺失的第一個正數

Leetcode 41.缺失的第一個正數

缺失的第一個正數

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

示例 1:

輸入: [1,2,0]

輸出: 3

示例 2:

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

輸出: 2

示例 3:

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

輸出: 1

說明:

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

 

雖然不能再另外開闢非常數級的額外空間,但是可以在輸入陣列上就地進行swap操作。

思路:交換陣列元素,使得陣列中第i位存放數值(i+1)。最後遍歷陣列,尋找第一個不符合此要求的元素,返回其下標。整個過程需要遍歷兩次陣列,複雜度為O(n)

下圖以題目中給出的第二個例子為例,講解操作過程。

 1 class Solution {
 2     public int firstMissingPositive(int[] nums) {
 3         int n=nums.length;
 4         int i=0;
 5         while(i<n){
 6             if(nums[i]!=(i+1) && nums[i]>=1 && nums[i]<=n && nums[nums[i]-1]!=nums[i]){
7 int temp=nums[i]; 8 int index=nums[i]-1; 9 nums[i]=nums[index]; 10 nums[index]=temp; 11 }else 12 i++; 13 } 14 for(i=0;i<n;i++) 15 if(nums[i]!=(i+1)) 16 return
i+1; 17 return n+1; 18 } 19 }