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

  • 相关阅读:
    如何面试程序员?
    开始做项目
    ===
    依赖注入获得一个对象却想返回不同的值(Error)
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not reread row data for column 4.
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.
    .net 4.5新特性
    有限状态机简单示例
    JavaScript入门经典(第四版)文摘
    小强升职记读后感
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6377937.html
Copyright © 2011-2022 走看看