给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
困难题,不会做。
class Solution { public int firstMissingPositive(int[] nums) { int n = nums.length ; for(int i = 0 ; i < n ; i ++){ if(nums[i]<=0){ nums[i] = n + 1 ; } } for(int i = 0 ; i < n ; i ++){ int num = Math.abs(nums[i]); if(num <= n ){ nums[num-1] = - Math.abs(nums[num-1]); } } for(int i = 0 ; i < n ; i ++){ if(nums[i]>0){ return i + 1 ; } } return n + 1 ; } }第一种方法思路: 1,先把所有不再【1,n】区间的数,设置为n+1 2,遍历数组,把绝对值小于n的数,所对应的位置上的数变成负数(无论是多少,变成负的,即可) 3,找到第一个不是负数的位置,然后加1. 评价,非常巧妙。相当于为每个1,n范围内的数进行了负数的标记。
第二种方法:
class Solution { public int firstMissingPositive(int[] nums) { int n = nums.length ; for(int i = 0 ; i < n ; i ++){ while(nums[i]>0 && nums[i] <= n && nums[nums[i]-1] != nums[i]){ int temp = nums[i] ; nums[i] = nums[nums[i]-1] ; nums[temp-1] = temp ; // int temp = nums[nums[i]-1] ; // nums[nums[i]-1] = nums[i] ; // nums[i] = temp; } } for(int i = 0 ; i < n ; i ++){ if(nums[i]!=i+1){ return i + 1 ; } } return n + 1 ; } }思路:把每个【1,n】之间的数放到他应该在的地方(3就放在2号位) 1,把每个在【1,n】之间的数,放在其对应的位置上。 2,找到第一个nums[i] != i +1 的数。就是那个最小值。
两种方法,都是应用的自身数组,一个进行标记,一个进行置换。
关键的点没有想到。就是长度为n的数组,最大的结果也就是n+1不可能更大了。 否则就应该在【1,n】之间。