此题思路不易想到。
首先思路参照网上,因为是O(n),很自然想到用hash或bitmap,但不能用更多的存储,就用该数组本身吧。用正负来表示是否存在,所以第一遍的时候把负数变成不可能的正数,此处设为Integer.MAX_VALUE。
编写中错误几次,1.是length为0;2.同一个数出现两遍,那么本来负过一次可能会错误的又负负得正,所以要判断;3.要用index0表示1,这样才表示的全。
public class Solution { public int firstMissingPositive(int[] A) { // Start typing your Java solution below // DO NOT write main() function if (A.length == 0) return 1; for (int i = 0; i < A.length; i++) { if (A[i] <= 0) { A[i] = Integer.MAX_VALUE; } } for (int i = 0; i < A.length; i++) { int idx = A[i] > 0 ? A[i] : -A[i]; if (idx <= A.length && A[idx-1] > 0) { A[idx - 1] = -A[idx - 1]; } } for (int i = 0; i < A.length; i++) { if (A[i] > 0) { return i+1; } } return A.length+1; } }
python3,此处用了len(nums) + 1表示不可能的数
class Solution: def firstMissingPositive(self, nums: List[int]) -> int: # remove negative ones and ones outside length for i in range(len(nums)): if nums[i] <= 0: nums[i] = len(nums) + 1 for i in range(len(nums)): num = abs(nums[i]) if num > 0 and num <= len(nums): # flip nums[num - 1] nums[num - 1] = -abs(nums[num - 1]) for i in range(len(nums)): if nums[i] > 0: return i + 1 return len(nums) + 1