LeetCode OJ算法题(四十):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.

解法:

这题要求查找数组中缺少的最小正整数,而且只能在线性时间内和常数空间内完成,所以不能用HashSet!

参考别人的解决思路,第一遍遍历数组,使得下标为i的数组元素的值为i+1,或者说让数组中的所有正整数k,都在下标为k-1的位置!第二遍只要检查第一个出现A[k-1]!=k的k就可以了。

那么问题就是怎么让正整数k放在A[k-1]中:

首先我们遍历数组,如果数组元素A[i]大于0,那么我们需要将它放在A[A[i]-1],当然还需要检查

1、是否需要移动;如果A[i]已经等于i+1或者A[A[i]-1]已经等于A[i],则不需要交换

2、下表是否越界。如果A[i]-1大于数组最大下标,也不需要移动。

public class No40_FirstMissingPositive {
	public static void main(String[] args){
		System.out.println(firstMissingPositive(new int[]{4,6,3,-1,1}));
	}
	public static int firstMissingPositive(int[] A) {
        int i = 0;
        while(i<A.length){
        	if(A[i]!=i+1 && A[i]>0 && A[i]-1<A.length && A[A[i]-1]!=A[i]){
        		swap(A, i, A[i]-1);
        	}
        	else i++;
        }
        i = 0;
        while(i<A.length && A[i]==i+1) i++;
        return i+1;
    }
	public static void swap(int[] A, int i, int j){
		A[i] += A[j];
		A[j] = A[i] - A[j];
		A[i] = A[i] - A[j];
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值