码迷,mamicode.com
首页 > 其他好文 > 详细

41. First Missing Positive

时间:2017-02-08 14:43:18      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:等于   math   iss   should   ++   color   pos   first   空间   

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.

本题开始没认真审题,后来发现要求在给定的空间里面做题。因此不能用missing number里面的创建数组来做;

看了discussion的讨论,发现很巧妙。首先,把数组分成两部分,把值大于0的数放在数组的前面,假设有k个大于0的值。然后在那些值大于0的部分遍历,如果值还小于等于k,那么就把那个索引的数组标记为负数,依次遍历,代码如下:

public class Solution {

    public int firstMissingPositive(int[] nums) {

        int len = nums.length;

        if(len==0) return 1;

        int k =part(nums);

        for(int i=0;i<k;i++){

            int temp = Math.abs(nums[i]);

            if(temp<=k) nums[temp-1] = nums[temp-1]>0?-nums[temp-1]:nums[temp-1];

        }

        int res = k+1;

        for(int i=0;i<k;i++){

            if(nums[i]>0){

                res = i+1;

                break;

            }

        }

        return res;

    }

    public int part(int[] nums){

        int q = 0;

        for(int i=0;i<nums.length;i++){

            if(nums[i]>0){

                swap(nums,q++,i);

            }

        }

        return q;

    }

    public void swap(int[] nums,int i,int j){

        int temp = nums[i];

        nums[i] = nums[j];

        nums[j] = temp;

    }

}

这道题可以用来解决所有不连续出现的值,是否连续的问题,但是,missing number是不可以这么解决的,因为包括了0,而0没有负数。这道题的隐身含义是,相当于创建了一个boolean类型的数组。

41. First Missing Positive

标签:等于   math   iss   should   ++   color   pos   first   空间   

原文地址:http://www.cnblogs.com/codeskiller/p/6377937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!