标签:
原题链接在这里:https://leetcode.com/problems/first-missing-positive/
两遍扫描,第一遍时swap A[i] 和它 对应的位置元素A[A[i]-1].
第二遍时找是否有 A[i] != i+1的,若有就返回i+1, 若没有,就返回A.length+1.
Note: 第一遍扫描时 swap 的条件是 A[i] 大于0并且小于等于 A.length, 如此A[i]-1才有对应的位置;并且排除掉A[i] == A[A[i]-1]情况,即两点已经相同,不需要swap, 否则陷入infinite.
做这类swap时注意对调是否相同,是否会造成infinite loop.
i--是保证swap后 i 返回原位。
AC Java:
1 public class Solution { 2 public int firstMissingPositive(int[] A) { 3 if(A == null || A.length == 0){ 4 return 1; 5 } 6 //First Iteration, swap A[i] to its corresponding position A[A[i]-1] 7 for(int i = 0; i<A.length; i++){ 8 if(A[i]>0 && A[i]<=A.length && A[i]!=A[A[i]-1]){ 9 swap(A, i, A[i]-1); 10 i--; 11 } 12 } 13 //Second Iteration, return i+1 if A[i] != i+1 14 for(int i = 0; i<A.length; i++){ 15 if(A[i] != i+1){ 16 return i+1; 17 } 18 } 19 //All correspond, return A.length+1 20 return A.length + 1; 21 } 22 public void swap(int [] A, int i, int j){ 23 int temp = A[i]; 24 A[i] = A[j]; 25 A[j] = temp; 26 } 27 }
LeetCode First Missing Positive
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4881242.html