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

  • 相关阅读:
    CTO这点事(技术,业务,管理,情商,周期,趋势)转
    Unit Test相关问题汇总
    优秀的命令行文件传输程序(转)
    ZOJ3329之经典概率DP
    Sql Server 2005 开发版亲測可用下载地址
    Hadoop与HBase中遇到的问题
    Struts2自己定义拦截器实例—登陆权限验证
    手游Apk破解疯狂,爱加密apk加固保护开发人员
    HighCharts 具体使用及API文档说明
    Linux(SLES)挂载NTFS移动硬盘实践
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6377937.html
Copyright © 2011-2022 走看看