LeetCode 41. First Missing Positive

一 题目

  Given an unsorted integer array, find the smallest missing positive integer.

Example 1:

Input: [1,2,0]
Output: 3

Example 2:

Input: [3,4,-1,1]
Output: 2

Example 3:

Input: [7,8,9,11,12]
Output: 1

Note:

Your algorithm should run in O(n) time and uses constant extra space.

二 分析

题目是hard级别难度,如果不做限制题目本身不难,求无序数组里面插入第一个正数。

但是要求时间复杂度为O(N).而且使用常数的额外空间,所以hashset或者新数组那些也用不了。

如果使用优先级队列或者排序。时间复杂度应该是O(NlogN).先排序,再从1开始找,这是不符合要求的。

public static int firstMissingPositive(int[] nums) {
	     int min =1;
	     if(nums == null){
	    	 return min;
	     }
	     //先排序
	     Arrays.sort( nums );
	     
	     for(int i=0;i< nums.length;i++){
	    	 if(nums[i]<=0){
	    		 continue;
	    	 }
	    	 else if(  min

Runtime: 1 ms, faster than 36% of Java online submissions for First Missing Positive.

Memory Usage: 34.7 MB, less than 100.00% of Java online submissions for First Missing Positive.

怎么做到O(N)呢?卡住了。网上看到大神的文章:https://blog.csdn.net/Jin_Kwok/article/details/51039381

作者提出了一种很巧妙的办法,类似于hash表,并不关心那些小于1和大于给定数据集长度(作者给出了解释),采用交换元素的方式,将数组下标与数组元素大小对应起来。我们遍历整个数组,如果当前元素i在1-n之间那么就将当前元素和数组第i-1个元素交换,遍历结束之后原始数组当中出现在1-n之间的元素都被放在了对应的0~n-1的位置里。再次遍历数组,找到第一个不满足v[i]==i+1的位置,那么i+1就是最小的未出现的正整数。

  举例来说:例 2的【3,4,-1,1】 遍历之后顺序为【1,-1,3,4】 显然nums[1]为-1 不等于2.就是它。

   

public static void main(String[] args) {
		int[] nums ={1,2,0};
		System.out.println( firstMissingPositive(nums) ) ;
		int[] nums1 ={3,4,-1,1};
		System.out.println( firstMissingPositive(nums1) ) ;
		int[] nums2 ={7,8,9,11,12};
		System.out.println( firstMissingPositive(nums2) ) ;
	}
	
	public static int firstMissingPositive(int[] nums) {
	   
	     if(nums == null){
	    	 return 1;
	     }
	     int n = nums.length;
	     
	     for(int i=0;i0&&nums[i]<=n&&  nums[i] != nums[ nums[i]-1]){
	    		 ////不在期望位置则移动至期望位置
	    		 int tmp = nums[nums[i]-1];
	    		 nums[nums[i]-1] = nums[i];
	    		 nums[i] = tmp;
	    	 }
	    	 
	     }
	     int i=0;
	     for(;i

 Runtime: 0 ms, faster than 100.00% of Java online submissions for First Missing Positive.

Memory Usage: 34.9 MB, less than 100.00% of Java online submissions for First Missing Positive.

 

 

 

你可能感兴趣的:(数组,First,Missing,Positive,算法,LeetCode,索引,leetcode)