• LeetCode OJ 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.


    【题目分析】

    给定一个整数数组,找出数组中第一个缺失的正整数。比如[1,2,0]缺少3,[3,4,-1,1]缺少2。


    【思路】

    1. 复杂度为O(n2)

    在数组中分别查找1,2,3,···,nums.length,返回查找到的第一个不在数组中的值。最坏情况下需要nums.length次遍历数组,平均时间复杂度为O(n2)。

    2. 复杂度为O(n)

    如何更加简单得处理这个问题呢?在使用固定空间的约束下,我们当然是要在原来的数组上做文章。想法如下:

    (1)遍历数组,如果当前元素nums[i]等于i+1,则表示第i+1个正数没有缺失,继续向后遍历;

    (2)如果当前元素小于等于零或者大于nums.length,则继续向后遍历;

    (3)如果当前元素大于零而且小于等于nums.length,则把nums[nums[i]-1]与nums[i]交换。

    这样处理的结果就是我们把每一个正数n都放在了n-1的位置上,然后再从头遍历数组,如果某个位置k不满足nums[k] == k+1,则返回缺失的正数k+1,如果遍历到数组末尾,则返回nums.length+1;


    【java代码】

     1 public class Solution {
     2     public int firstMissingPositive(int[] nums) {
     3         if(nums == null || nums.length == 0) return 1;
     4         int i = 0;
     5         
     6         while(i < nums.length){
     7             if(nums[i] == i+1) i++;
     8             else if(nums[i] > 0 && nums[i] <= nums.length){
     9                 int temp = nums[nums[i] - 1];
    10                 if(temp != nums[i]){
    11                     nums[nums[i] - 1] = nums[i];
    12                     nums[i] = temp;
    13                 }
    14                 else i++;
    15             }
    16             else i++;
    17         }
    18         
    19         for(i = 0; i < nums.length; i++)
    20             if(nums[i] != i+1) return i+1;
    21         return nums.length+1;
    22     }
    23 }
  • 相关阅读:
    17._4Csharp中正则表达式的匹配
    15.13DataGridView单元格自动填充
    C#安装,启动,停止,卸载Windows服务
    C# 如何判断系统是32位还是64位
    [转]Excel关闭进程
    利用.Net中Process类调用netstat命令来判断计算端口的使用情况
    转:C# 获取指定目录下所有文件信息、移动目录、拷贝目录
    做安装包,安装后自动运行程序
    ...
    SharpZIP Lib
  • 原文地址:https://www.cnblogs.com/liujinhong/p/5648999.html
Copyright © 2020-2023  润新知