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.

给出一组数,找到里面缺少的第一个正数。

让o(n)时间,而且是o(1)空间。

一开始想的是记录正数的个数和他们的和,利用1~n的公式求和,减去sum,看缺了哪个。

指导提交错误,发现居然可以输入 [1,1]。原来还可以有重复的。

想到应该是利用了原来的数组。

用原来的数组做哈希。

对于每一个数,把它放到它应该在的位置上。比如一个4,把它放到a[3]的位置上。

原来的数怎么办呢?调换。a[3]原来的数就放在a[i]的位置。反复调换,反复调换。当然其中有坑的,我提交了三次才AC了。

下面代码的执行效果就是:

比如输入 -3  1  5  3  2

index  0  1  2  3  4

————————————————

i = 0:  -3  1  5  3  2  负值跳过了

i = 1:  1  -3  5  3  2  swap(-3,1)

i = 1:  1  -3  5  3  2  负值跳过

i = 2:  1  -3    3    swap(5,2)

i = 2:  1  2  -3  3  5  swap(2,-3)

i = 2:  1  2  -3  3  5  负数跳过

i = 3:  1  2   3  -3  5  swap(-3,3)

i = 4:  1  2   3  -3  5  负数跳过

最后变成了    1  2   3  -3  5

很明显,缺的是4啦。

class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int i,j,n,tmp;
vector<int> &a = nums;
n = a.size(); if(n == ) return ; for(i = ,j = ; i < n; i++)
{
if(a[i] > && a[i] != i + )    //一个正数不在它自己的位置上,
{
tmp = a[i] - ;          //tmp是它应该呆的位置
if(tmp < n && a[tmp]!= a[i])  //防止下标越界和 死循环
{
swap(a[tmp],a[i]);
i--;
}                //这个调换最多会有多少次呢? 最多也就是n次。因为n次以后,n个数都会在正确的位置了。
}
}
for(i = ; i<n; i++)        //数一数,看看中间却了哪个呢?如果都不缺,那就是1..n的连续数组,就返回 n + 1
{
if(a[i] != i + )
break;
} return i + ;
}
};

最新文章

  1. VS2013的 Browser Link 引起的问题
  2. 推荐轻量高效无依赖的开源JS插件和库
  3. mysql 数据库基本概念
  4. expert C Programing notes
  5. 防火墙没关导致 ORA-12541: TNS: 无监听程序
  6. hdu1430魔板(BFS+康托展开)
  7. HDU 1328 IBM Minus One
  8. WPF之让ListView中的CheckBox居中显示
  9. layer弹出层中H5播放器全屏出错解决 &amp; 属性poster底图占满&lt;video&gt;的方法
  10. 《RabbitMQ Tutorial》第 1 章 简介
  11. Windows Server 2008 R2提示api-ms-win-crt-runtime-l1-1-0.dll 丢失解决方法
  12. docker commit命令创建新的镜像
  13. ES6 系列之 Babel 是如何编译 Class 的(下)
  14. python中如何对待易过期的cookies
  15. iOS 使用xib定义一个View,修改frame无效问题解决
  16. 安装Adobe Acrobat XI Pro
  17. dbvisulizer 存储过程
  18. 保证java的jar包在后台运行
  19. java程序设计
  20. Python学习笔记020——数据库知识概述

热门文章

  1. 廖雪峰Java2-2数据封装-2构造方法
  2. git基本的使用原理
  3. c#day03
  4. 打开package.json 查看node版本并修改本地node版本
  5. CRM 2016 执行IFrame 子页面中函数
  6. 针对开发项目的NABCD的分析
  7. 集群中使用chronyc同步时间
  8. css的优化规则
  9. 删除n天前的所有目录和文件
  10. centos7 jdk