LeetCode OJ算法题(四十):First Missing Positive

来源:互联网 发布:js获取当前页面的url 编辑:程序博客网 时间:2024/05/17 00:10

题目:

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];}}




0 0
原创粉丝点击