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

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

    Example 1:

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

    Example 2:

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

    Example 3:

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

    Constraints:

    • 0 <= nums.length <= 300
    • -231 <= nums[i] <= 231 - 1

    Follow up: Could you implement an algorithm that runs in O(n) time and uses constant extra space?

    缺失的第一个正数。

    题意是给一个未排序的整数数组,找出其中没有出现的最小的正整数。

    这题的思路有些类似桶排序/抽屉原理,需要在对应的坐标上找到对应的数字,即数字i应该出现在坐标为i - 1的位置上,这样也能排除负数和大于数组长度的正数。 按照这个思路,需要扫描两遍,第一遍是将所有正整数放到他们应该去的位置上,第二遍再次扫描input的时候就能找出第一个缺失的正数了。

    时间O(n) - 题目要求

    空间O(1) - 题目要求

    JavaScript实现

     1 /**
     2  * @param {number[]} nums
     3  * @return {number}
     4  */
     5 var firstMissingPositive = function (nums) {
     6     // corner case
     7     if (nums === null || nums.length === 0) return 1;
     8 
     9     // normal case
    10     for (let i = 0; i < nums.length; i++) {
    11         while (nums[i] > 0 && nums[i] < nums.length && nums[nums[i] - 1] !== nums[i]) {
    12             let temp = nums[nums[i] - 1];
    13             nums[nums[i] - 1] = nums[i];
    14             nums[i] = temp;
    15         }
    16     }
    17 
    18     // double check
    19     for (let i = 0; i < nums.length; i++) {
    20         if (nums[i] !== i + 1) {
    21             return i + 1;
    22         }
    23     }
    24     return nums.length + 1;
    25 };

    Java实现

     1 class Solution {
     2     public int firstMissingPositive(int[] nums) {
     3         // corner case
     4         if (nums == null || nums.length == 0) {
     5             return 1;
     6         }
     7 
     8         // normal case
     9         for (int i = 0; i < nums.length; i++) {
    10             // 如果swap的动作按照注释中的部分写
    11             // 一定要把nums[nums[i] - 1]先赋值给temp,否则如下的case是会越界的
    12             // [3, 4, -1, 1]
    13             while (nums[i] > 0 && nums[i] < nums.length && nums[nums[i] - 1] != nums[i]) {
    14                 // int temp = nums[nums[i] - 1];
    15                 // nums[nums[i] - 1] = nums[i];
    16                 // nums[i] = temp;
    17                 swap(nums, i, nums[i] - 1);
    18             }
    19         }
    20 
    21         // double check
    22         for (int i = 0; i < nums.length; i++) {
    23             if (nums[i] != i + 1) {
    24                 return i + 1;
    25             }
    26         }
    27         return nums.length + 1;
    28     }
    29 
    30     private void swap(int[] nums, int i, int j) {
    31         int tmp = nums[i];
    32         nums[i] = nums[j];
    33         nums[j] = tmp;
    34     }
    35 }

    相关题目

    41. First Missing Positive

    268. Missing Number

    442. Find All Duplicates in an Array

    448. Find All Numbers Disappeared in an Array

    765. Couples Holding Hands

    LeetCode 题目总结

  • 相关阅读:
    Boost智能指针——shared_ptr
    Boost.asio的简单使用(timer,thread,io_service类)
    ACE线程管理机制
    利用boost::asio实现一个简单的服务器框架
    【转载】boost::lexical_cast 的使用
    BOOST 实用手册(摘录自校友博客)
    ACE的安装
    Microsoft SQL Server 2000 中的数据转换服务 (DTS)
    将 DTS 用于业务智能解决方案的最佳实践
    [转]理解“Future”
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12425097.html
Copyright © 2011-2022 走看看