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.

思路:n个数,可能的最大正整数是n,所以可以将这n个数作为哈希值。但是这样要有O(n)的额外空间。

解决方法是复用A[], 首先将A[i]中的负数剔出(标记为n+1);第二次遍历时,将<=n的正整数交换到下标为n-1的位置。

class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int size = nums.size();
int tmp,i;
for(i =; i < size; i++){
if(nums[i]<=) nums[i]=size+;
} i = ;
while(i < size){
if(nums[i]<=size && nums[i]!=i+){
if(nums[nums[i]-]==nums[i]){//repeat digit occurs
nums[i]=size+;
i++;
}
else{
tmp=nums[nums[i]-];
nums[nums[i]-]=nums[i];
nums[i]=tmp;
}
}
else{
i++;
}
} for(int i = ; i < size; i++){
if(nums[i]!=i+){
if(i>) return nums[i-]+;
else return ;
}
}
return size+;
}
};

改进: 我们可以不用tmp进行交换,省去O(1)的空间,也减少赋值的次数。当遍历到一个整数cur的时候,将A[cur]变成相反数,这样A[i]<0的i位置表示i出现过了,还保证了A[i]原来的值没被破坏(可以通过abs(A[i])获得)。

class Solution {
public:
int firstMissingPositive(int A[], int n) {
int i;
for (i = ; i < n; i++)
if(A[i]<=) A[i] = n+;
for (i = ; i < n; i++) {
if(abs(A[i]) <= n ){ //需要abs,因为在for循环中,我们将值为[1,n]的元素改成了负数
int cur = abs(A[i])-;
A[cur] = -abs(A[cur]);
}
}
for (i = ; i < n; i++) {
if (A[i] > ) return i+;
}
return n+;
}
};

41. First Missing Positive (HashTable)的更多相关文章

  1. LeetCode - 41. First Missing Positive

    41. First Missing Positive Problem's Link ---------------------------------------------------------- ...

  2. [Leetcode][Python]41: First Missing Positive

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 41: First Missing Positivehttps://oj.le ...

  3. [array] leetcode - 41. First Missing Positive - Hard

    leetcode - 41. First Missing Positive - Hard descrition Given an unsorted integer array, find the fi ...

  4. LeetCode题解41.First Missing Positive

    41. First Missing Positive Given an unsorted integer array, find the first missing positive integer. ...

  5. 刷题41. First Missing Positive

    一.题目说明 题目是41. First Missing Positive,求一个未排序队列中缺失的最小正整数.时间复杂度要求是O(n).难度是Hard,确实难. 二.我的解答 不考虑时间复杂度,首先对 ...

  6. [LeetCode] 41. First Missing Positive 首个缺失的正数

    Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...

  7. 41. First Missing Positive (JAVA)

    Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...

  8. leetcode 41 First Missing Positive ---java

    Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0]  ...

  9. 41. First Missing Positive

    题目: Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2 ...

随机推荐

  1. websocket 缺点

    当时用 python 做的服务器,后来回去想再工作项目上用,但新的技术升级,随之而来还是要解决很多非技术问题, 服务器带宽,并发服务器性能方方面面考虑之后还是没有用上,十分可惜, 一个新的技术推动,尤 ...

  2. “之”字形输出二叉树 python

    “之”字形输出二叉树即第1层从左到右输出,第2层从右到左输出,第3层从左到右输出......第2*n层从右到左输出,第2*n+1层从左到右输出,如下图所示二叉树,“之”字形输出的结果为:1-3-2-4 ...

  3. VirtualBox只能生成32位虚拟机

    /************************************************************************* * VirtualBox只能生成32位虚拟机 * ...

  4. 用yum安装lamp和lnmp环境

    LAMP: 1.首先安装Apache和mysql: yum install -y httpd mysql mysql-server mysql-devel 2.启动httpd和mysqld: serv ...

  5. 抽取JDBCTemplate

    抽取JDBCTemplate 为了解决DAO实现类中代码的重复问题,另外使得代码更通用,所以抽取一个公共的模板,使其更具有通用性. DAO实现类的代码 public class StudentDAOI ...

  6. streamsets Executors 说明

    执行程序阶段在收到事件时触发任务.执行者不会写入或存储事件. 将执行程序用作事件流中数据流触发器的一部分,以执行事件驱动的与管道相关的任务,例如在目标关闭时移动完全写入的文件. 可以使用的execut ...

  7. 禅道导出数据,excel打开为乱码处理

    禅道里面导出的数据,用Excel打开是乱码(如图),如何解决? 第一步: 第二步: 第3步: 第4步: 第5步: 选择一个储存位置 最后的结果就是这样了

  8. 【转】inittab文件

    原文网址:http://blog.csdn.net/shuaishuai80/article/details/6202482 一.inittab文件背景(1)init进程的作用   使用uboot下载 ...

  9. Shell实现Unix进程间信息交换的几种方法

    本文将介绍在SCO OpenServer5.0.5系统中使用shell语言来实现进程间信息交换的几种方法: 使用命名管道实现进程间信息交换 使用kill命令和trap语句实现进程间信息交换 使用点命令 ...

  10. (转)如何实现CSS限制字数,超出部份显示点点点...

    <div style="width:200px; white-space:nowrap;overflow:hidden;text-overflow:ellipsis; border:1 ...