首页 > 其他 > 详细

[LeetCode]First Missing Positive,解题报告

时间:2014-02-05 22:54:26      阅读:499      评论:0      收藏:0      [点我收藏+]

题目

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.


思路1

我的第一反应是利用java的HashSet类:
  1. 将数组中的元素存放到HashSet中,此过程去除了重复元素
  2. 从1到A.length进行遍历,遍历期间哪个int值不存在于HashSet中,则这个int值为第一个丢失的正数

AC代码

public class Solution {
    public int firstMissingPositive(int[] A) {
        int miss = A.length + 1;
        
        HashSet<Integer> hashset = new HashSet<Integer>();
        for (int i = 0; i < A.length; i ++) {
            hashset.add(A[i]);
        }
        
        for (int i = 1; i <= A.length; i ++) {
            if (! hashset.contains(i)) {
                miss = i;
                break;
            }
        }
        
        return miss;
    }
}



思路2

因为题目中要求的是常量的空间复杂度,思路1的空间复杂度明显为O(n)了,不符合题意,因此需要在数组自身上就地进行swap操作

首先,明确一个前提,丢失的第一个正数一定是区间[1 ~ A.length + 1]之间的数据

其次,0是-1与1之间的整数。0不正也不负

因此,我们可以用数组A[i]存放(i + 1),从头开始遍历数组,哪个数值没有放在正确的位置(忽略不符合要求的数),将这个数交换到正确的位置,时间复杂度为O(n),空间复杂度为O(1)。

最后,再从i = 0 开始遍历数组,第一个A[i] != i + 1的数即为缺失的数据

AC代码

public class Solution {
    public int firstMissingPositive(int[] A) {
        int tmp, miss = A.length + 1;

        for (int i = 0; i < A.length;) {
            if (A[i] != i + 1 && A[i] >= 1 && A[i] <= A.length && A[i] != A[A[i] - 1]) {
                tmp = A[A[i] - 1];
                A[A[i] - 1] = A[i];
                A[i] = tmp;
            } else {
                i ++;
            }
        }

        for (int i = 0; i < A.length; i++) {
            if (A[i] != i + 1) {
                miss = i + 1;
                break;
            }
        }

        return miss;
    }
}

[LeetCode]First Missing Positive,解题报告

原文:http://blog.csdn.net/wzy_1988/article/details/18940015

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!