Leetcode 41.缺失的第一個正數
阿新 • • 發佈:2018-12-23
缺失的第一個正數
給定一個未排序的整數陣列,找出其中沒有出現的最小的正整數。
示例 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 returni+1; 17 return n+1; 18 } 19 }