40. First Missing Positive
Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.
Your algorithm should run in O(n) time and uses constant space.
---
constant space, --> swap!
桶排序,只不过不许用额外空间。
每次当A[i]!= i的时候,将A[i]与A[A[i]]交换,也就是把A[i]放到它应该在的位置A[A[i]]
直到无法交换位置。
---
不能按照A[i] = i来存, 题目是检查positive integer,没有0的事情
比如当A = {1},如果A[0] = 0的话,根本没地方存1的值了。
所以正确的存储方式应该是A[i]= i+1.
---
然后重新走一遍,检查A[i] == i+1
O(n)。
public class Solution { public int firstMissingPositive(int[] A) { int i = 0; int n = A.length; while (i < n){ int val = A[i]; if(val != (i+1) //当前存值不对 && val >= 1 //val要存在val-1,太小的超出数组边界 && val <= n //val要存在val-1, 太大的超出数组边界 && A[val-1] != val) // val应该存放的地方A[val-1], // 已经放好了正确值A[i], dup {1,1}, 不用转存 swap(A, i, A[i]-1); else i++; } for (i = 0; i < n; ++i) if (A[i] != (i+1)) return i+1; return n+1; } private void swap(int[] arr, int i, int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } }
浙公网安备 33010602011771号