• LeetCode 41. First Missing Positive


    原题链接在这里:https://leetcode.com/problems/first-missing-positive/

    题目:

    Given an unsorted integer array, find the smallest missing positive integer.

    Example 1:

    Input: [1,2,0]
    Output: 3
    

    Example 2:

    Input: [3,4,-1,1]
    Output: 2
    

    Example 3:

    Input: [7,8,9,11,12]
    Output: 1
    

    Note:

    Your algorithm should run in O(n) time and uses constant extra space.

    题解:

    两遍扫描,第一遍时swap nums[i] 和它对应的位置元素nums[nums[i]-1]. 为什么对应位置是nums[nums[i]-1]而不是nums[nums[i]]呢? 举个例子nums = [2,1,3], first missing positive 是 4. 若对应位置是nums[i]的话就会swap成[3,1,2], 就会return错误的值.

    第二遍时找是否有 nums[i] != i+1的,若有就返回i+1.

    若走到头还没有return, 说明first missing positive 是 nums.length+1.

    Note: 第一遍扫描时 swap 的条件是 nums[i]-1>=0并且<nums.length, 如此nums[i]-1才有对应的位置;并且排除掉nums[i] == nums[nums[i]-1]情况,即两点已经相同,不需要swap, 否则陷入infinite loop. 做这类swap时注意对调是否相同,是否会造成infinite loop. 

    i--是保证swap后 i 返回原位。

    Time Complexity: O(n). Space: O(1).

    AC Java:

     1 class Solution {
     2     public int firstMissingPositive(int[] nums) {
     3         if(nums == null){
     4             throw new IllegalArgumentException("Input array is null.");
     5         }
     6         
     7         for(int i = 0; i<nums.length; i++){
     8             if(nums[i]-1>=0 && nums[i]-1<nums.length && nums[i] != nums[nums[i]-1]){
     9                 swap(nums, i, nums[i]-1);
    10                 i--;
    11             }
    12         }
    13         
    14         for(int i = 0; i<nums.length; i++){
    15             if(nums[i] != i+1){
    16                 return i+1;
    17             }
    18         }
    19         
    20         return nums.length+1;
    21     }
    22     
    23     private void swap(int [] nums, int i, int j){
    24         int temp = nums[i];
    25         nums[i] = nums[j];
    26         nums[j] = temp;
    27     }
    28 }

     类似Missing NumberFind the Duplicate Number.

  • 相关阅读:
    java、el表达式中保留小数的方法
    EL表达式取整数或者取固定小数位数的简单实现
    Spring框架学习之第8节
    shell脚本接收输入
    awk除去重复行
    awk过滤统计不重复的行
    Spring框架学习之第7节
    jsp中利用checkbox进行批量删除
    javaScript解决Form的嵌套
    Spring框架学习之第6节
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4881242.html
Copyright © 2020-2023  润新知