【趣味算法题】找到缺失的最小正整数
2015-06-07 15:55
423 查看
【题目描述】
有一个随机序列的数组,找到其中缺失的最小正整数
举例如下,在[1, 2, 0] 中,该最小正整数应为3
在[3, 4, -1, 1]中,该最小正整数应该为2
【解题思路】
如果允许开辟任意大小的空间,易得用桶的思想可以解决这题
简单的说,开辟一个数组,从1扫过来如果不存在那么break输出即可
如果对空间的要求是O(1) ,利用桶排序接下来有一个非常漂亮的解决方法:
我们可以把每个数字放在其该放的地方。什么意思呢?
比如 A[0] = 1, A[1] = 2, A[2] = 3, 诸如此类
然后放好之后从1扫过来如果不存在那么break输出即可
关键就是在于,如何将每个数字放在其该放的地方呢
方法如下:
如果 A[i] 是合法的数 (合法的意思是 A[i] > 0 && A[i] < n)
那么A[i] 应该放的位置为 A[A[i] - 1] 才对。
如果当然的 A[i] 不在 A[A[i] - 1] 的话,那么swap (A[i], A[A[i] - 1]) 即可
这到题目就是利用这个思路解决,如果碰到重复出现的数字也是可以解决 :)
【算法效率分析】
O(1) space, and O(n) time
My Source Code:
推荐阅读文章:
有一个随机序列的数组,找到其中缺失的最小正整数
举例如下,在[1, 2, 0] 中,该最小正整数应为3
在[3, 4, -1, 1]中,该最小正整数应该为2
【解题思路】
如果允许开辟任意大小的空间,易得用桶的思想可以解决这题
简单的说,开辟一个数组,从1扫过来如果不存在那么break输出即可
如果对空间的要求是O(1) ,利用桶排序接下来有一个非常漂亮的解决方法:
我们可以把每个数字放在其该放的地方。什么意思呢?
比如 A[0] = 1, A[1] = 2, A[2] = 3, 诸如此类
然后放好之后从1扫过来如果不存在那么break输出即可
关键就是在于,如何将每个数字放在其该放的地方呢
方法如下:
如果 A[i] 是合法的数 (合法的意思是 A[i] > 0 && A[i] < n)
那么A[i] 应该放的位置为 A[A[i] - 1] 才对。
如果当然的 A[i] 不在 A[A[i] - 1] 的话,那么swap (A[i], A[A[i] - 1]) 即可
这到题目就是利用这个思路解决,如果碰到重复出现的数字也是可以解决 :)
【算法效率分析】
O(1) space, and O(n) time
My Source Code:
#include <iostream> #include <vector> #include <algorithm> using namespace std; class Solution { public: int firstMissingPositive(vector<int>& nums) { bucket_sort (nums); for (int i = 0; i < nums.size (); ++i) { if (nums[i] != i + 1) { return i + 1; } } return nums.size () + 1; } void bucket_sort (vector <int> & nums) { for (int i = 0; i < nums.size (); ++i) { while (nums[i] != i + 1) { if (nums[i] < 0 || nums[i] > nums.size () || \ nums[i] == nums[nums[i] - 1]) { break; } cout << "i = " << i << "\t" << nums[i] << "\t" << nums[nums[i] - 1] << endl; swap (nums[i], nums[nums[i] - 1]); cout << "\t"; for (int j = 0; j < nums.size (); ++j) { cout << nums[j] << " "; } cout << endl << endl; } } } }; int main () { Solution sl; vector <int> vc; vc.push_back (3); vc.push_back (-4); vc.push_back (2); vc.push_back (1); vc.push_back (5); cout << sl.firstMissingPositive (vc); return 0; }
推荐阅读文章:
三种线性排序算法 计数排序、桶排序与基数排序
https://www.byvoid.com/blog/sort-radix/相关文章推荐
- [LeetCode][JavaScript]Plus One
- 美化博客园界面(让您的博客更加赏心悦目)希望对您有用
- iOS开发UI高级—03Date Picker和UITool Bar控件简单介绍
- 在Latex中写伪代码的两个例子
- session timer(一)
- iOS开发UI高级—04多控制器和导航控制器简单介绍
- 日志组件logback的介绍及配置使用方法
- 股权代持的法律风险分析
- 十三周——输入输出流——项目一 小玩文件(2)
- Shell if 命令参数
- 给出设计类图
- JavaScript进阶 - 第10章 编程挑战
- linux --> 动态库和静态库
- oc-空指针和野指针
- 8.3.1 DMA的基本概念
- 解决2015-06-08日之前ES脚手架项目启动不了,一直停留在spring初始化阶段(唯一解决方案)
- 响应式布局
- Android读取Manifest文件下Application等节点下的metadata自定义数据
- Win10预览版Build 10135原版64位英文ISO系统镜像下载地址
- [leetcode] Implement Trie (Prefix Tree)