leecode刷题 之 41 FirstMissingPositive

参考链接 https://www.cnblogs.com/zhuifengjingling/p/5296805.html

题意:给出一个乱序(未排序)集合,找到这个集合中第一个不存在的正整数。(时间复杂度为O(n),空间负责度为长度)

例如: 输入集合 {1,2,0} 返回0;
输入集合 {3,4,-1,1} 返回2;

分析:对给出的集合中元素,依次判断正数x(从小到大),是否在集合中存在,只要有一个不满足,则返回这个不满足的数。

具体实现代码如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class HelloWorld {

    //用于测试的主方法
    public static void main(String[] args) {
        int[] arrays = {3,4,-1,1};

        System.out.println(getFirstMissingPositive(arrays));
    }

    public static List<List<Integer>> combinationSum1 = new ArrayList<>();

    /**
     * 获取集合中第一个缺失正数的方法
     * @param array
     * @return
     */
    public static int getFirstMissingPositive(int[] array) {
        //先对数据组进行排序,这个排序的规则不是升序也不是降序,而是根据数组元素
        // 的值去定位起在数组中的位置,比如1,肯定要排在数组的第一个位置
        // 那么,理想状态下
        //排序过后,对于长度为n的数组array,存在 array[i] = i+1,其中i>=1 && i<n
        //如果数组中有重复元素获取元素的值超过了array.length了,那么意味着必然有缺失的元素
        int n = array.length;
        for (int i = 0; i < n; i++) {
            //如果array[i] == i+1,则array[i]的值可以不改变
            //如果array[i] == array[array[i] - 1](array[i]的位置上有了一个相同值的元素,则就不交换位置)
            //如果array[i] 的值不在0-n之间,则无话定为到其的预期位置,所以不交换
            //只有不在以上三种情况下,才数组元素位置的调整
            if (array[i] != (i + 1) && array[i] > 0 && array[i] <= n && array[i] != array[array[i] - 1]) {
        // int tmp = array[i];
        //array[i] = array[array[i] - 1];
        //array[array[i] - 1] = tmp;
        //注意上面的交换是有问题,因为array[i]先发生了变化
                int tmp = array[array[i] - 1];
                array[array[i] - 1] = array[i];
                array[i] = tmp;
                //TODO 注意事项,因为值进行了交换需要重新对当前tmp的进行定位
                i--;
            }
        }
        //在进行一次遍历找到不合法数据的位置,进行返回
        for (int i=0;i<n;i++) {
            if (array[i] != i + 1) {
                return i + 1; //返回缺少的值
            }
        }
        return -1;
    }
}
运行结果如下:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/dirksmaller/article/details/79639535
今日推荐