给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0] 输出: 3
示例 2:
输入: [3,4,-1,1] 输出: 2
示例 3:
输入: [7,8,9,11,12] 输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
思路:
case1:length == 0 return 1
case2:length == 1 case2.1 [-1] [-....] [0] [2] [...] return 1
case2.2 [1] return 2
case3: length >1 跳过负数 case3.1 (nums[i] - nums[i-1] > 1) && (nums[i] > 1) [-1,2,3] or [-1,3,100] return 1
case3.2 (nums[i] - nums[i-1] > 1) && (nums[i] - nums[i-1] < nums[i]) [-1,1,3] return nums[i-1] + 1
case4: length > 1 i走到了最后一个 [1,2,3] return nums[nums.length -1 ] + 1
case5:length > 1 全为负数 return 1
1 class Solution { 2 public int firstMissingPositive(int[] nums) { 3 if(nums.length == 0 || nums == null) return 1; 4 Arrays.sort(nums); 5 if(nums.length == 1){ 6 if(nums[0] < 1 || nums[0] > 1){//[-1] [2] 7 return 1; 8 }else{ 9 return 2;//[1] 10 } 11 } 12 if(nums[0] > 1) return 1; 13 for(int i = 1;i < nums.length;i++){ 14 if(nums[i] < 0)continue; 15 if(nums[i] - nums[i-1] > 1 && nums[i] - nums[i-1] < nums[i]){//跳过[-1,2,3] 16 return nums[i - 1] + 1; 17 }else if(nums[i] - nums[i-1] > 1 && nums[i] > 1) return 1;//[-1,2,3] 18 if(i == nums.length - 1){ 19 return nums[i] + 1; 20 } 21 } 22 return 1; 23 } 24 }
2019-05-01 21:11:23