zoukankan      html  css  js  c++  java
  • 41. First Missing Positive

    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类型的数组。

  • 相关阅读:
    给任意多个链表然后要合并成一个
    hdu5967数学找规律+逆元
    poj2125最小点权覆盖+找一个割集
    poj3308 最小点权覆盖
    poj2987 最大闭合权子图基础题
    poj2699 转化为可行性判定问题+二分枚举+最大流
    判断割是否唯一zoj2587
    快排优化
    jvm垃圾收集器
    三次握手与四次挥手
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6377937.html
Copyright © 2011-2022 走看看