您的位置:首页 > 编程语言 > Java开发

leecode刷题 之 41 FirstMissingPositive

2018-03-21 14:21 260 查看
参考链接 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;
}
}


运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法 leecode