Coding interview:数组中未出现的最小正整数

题目描述

给定一个无序整型数组array,找出数组中未出现的最小正整数.
例如:
[-1,2,3,4] 返回1
[1,2,3,4] 返回5

解题思路

对于给定数组长度为N,我们希望数组中的数据为1,2,3,4…,N,这样最小的正整数则为N+1,但是事实情况并非我们所期待的这样,所以我们对数组进行一个划分,索引 i 左边的数组是从1开始逐个递增的,相差为1。索引 j 右边的数据是“无效数据”,“无效数据”的含义就是不在[1,N]中,或者已经出现重复的数字。初始状态i==0,j=length-1,当i>j 的时候,说明已经完全遍历了数组,i的位置就是空缺没有出现的正整数。具体算法过程如下:

  1. 当array[I]== I+1,I++;
  2. 当array[I]<=I 或者 array[I] > N, array[I]为无效数字,交换到j的右边,swap(I,j–);
  3. 当array[I] > I+1 && array[I] <=N,我们需要把array[I]这个数字放到array[I]-1 的位置上,但是如果array[I] 已经在array[I]-1 的位置上了,说明这个数字重复了,则同样移动到j的位置右边;

代码

int getMissNum(int[]array) {
        if (array==null || array.length==0) {
            return 1;
        }
        int i = 0;
        int j = array.length-1;
        int n = array.length;
        while(i<=j) {
            if (array[i] == i+1) {
                i++;
            } else if(array[i] <= i || array[i] > n || array[i] == array[array[i]-1]) {
                swap(array,i,j--);
            } else {
                swap(array,i,array[i]-1);
            }
        }
        return i+1;
    }

    private void swap(int[]array,int i,int j){
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }

    public static void main(String[]args) {
        MinPositiveNumber minPositiveNumber = new MinPositiveNumber();
        System.out.println(minPositiveNumber.getMissNum(new int[]{3,-1,1,7,7,7,7,9,10}));
    }

猜你喜欢

转载自blog.csdn.net/zhumingyuan111/article/details/83474403