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.
这个是"置换"思想,往深的说,这个与数学中的置换群有关。在TAOCP的排序章节中,开篇说的就是置换,而且有个题目:即,在O(N)时间,O(1)空间对数列{1,2,3,4,5,6,7,...}任意序列。进行原地排序。
先说排序:显然目标是A[i]=i+1
序列{2,1,4,3},那么其置换(1,2)(3,4),即1与2换位,3与4换位,置换个数=2
序列{4,1,2,3,1},那么其置换为(2,3,4,1},置换个数=1。长度=4.即,用2代替1,3代替2,4代替3,1代替4;对比下:
4,1,2,3
2,3,4,1
将第一行位置K,用第二列第K位置的元素i替代,就可以变成有序的。
序列{1,2,3,4}那么其置换为(1),(2),(3),(4),置换个数=4,如果置换个数=n,表明已经排序了。
因此,如果要排序,只要一次对其置换,进行处理
算法排序过程。注意序号是从0开始,而不是从1.
给定i,对某个置换排序:
如果A[i]的置换不为自己(即A[i]!=i+1),那么将A[i]-1所在的元素用A[i]替代,将被替代的元素设置成A[i],重复上述。
否则,(该置换已经排序)。
排序过程基本如此。
——————————————————————————————————————————————
本题,可以看成是,去掉所有非0和负数,以及大于n的数。对所有1,2,3..n进行原地排序。
显然,排序完成后,应该有A[i]=i+1,如果某个A[i]!=i+1,说明缺失该元素。
算法复杂度分析:
《1》1所在的for循环执行N次
《2》2看起来像是N*N,其实不是,2循环内部的执行次数为置换的长度,一旦完成。会修改其他元素位置。因此进入while循环的次数恰好为置换的个数,而while循环体总内共执行的次数有恰好为该置换的长度。
《3》最后一个for循环,似乎可以修改为二分查找,实际查找的是第一个满足A[i]!=i+1的元素
int firstMissingPositive(int A[], int n) { for(int i=0;i<n;i++)//<1>对每个i,检查其置换 { if(A[i]>n || A[i]<=0 || A[i]==i+1) { continue; } int j= A[i]-1; int last=A[i]; int old=j; while(A[j]!=j+1){//<2>对A[i]-1位置的进行置换(排序过程) old = A[j]; A[j] = last; j=old-1; last = old; } } for(int i=0;i<n;i++){ if(A[i]!=i+1){ return i+1; } } return n+1; }
相关推荐
leetcode 71 Python用 Python ...Positive (HARD) leetcode 42. 收集雨水 (HARD) leetcode 44. 通配符匹配 (HARD) leetcode 45. Jump Game II (HARD) Leetcode 51. N-Queens (HARD) Leetcode 52. N-
41. First Missing Positive 广度优先搜索 773. Sliding Puzzle 864. Shortest Path to Get All Keys 深度优先搜索 996. Number of Squareful Arrays 拓扑排序 269. Alien Dictionary 单调栈 42. Trapping Rain ...
leetcode打不开Leetcode Note Tips Tip1: Two pointer for sorted array (#Array 1. Two Sum) Tip2: Sum[i:j] = Sum[0:j] - Sum[0:i] for continuous array (# Array 560. Subarray Sum Equals K) Tip3: Knapsack ...
├── First Missing Positive │ ├── Readme.md │ └── solution.js ├── Trapping Rain Water │ ├── Readme.md │ └── solution.js ├── Wildcard Matching │ ├── Readme.md │ └── ...
题:**First Missing Positive 给定一个未排序的整数数组,找到第一个缺失的正整数。 例如,给定 [1,2,0] 返回 3,而 [3,4,-1,1] 返回 2。 您的算法应该在 O(n) 时间内运行并使用恒定空间。 **第 0003 题:**String ...
41_First_Missing_Positive 299_Bulls_and_Cows 134_Gas_Station 118_Pascal's_Triangle_I 119_Pascal's_Triangle_II 169_Majority_Element 229_Majority_Element_II 274_H_索引 275_H_Index_II 217_Contain_...
leetcode 2 code_interview leetcode和lintcode的一些题目的解法 是剑指offer 是面试中遇到的有意思的题目总结,比如说BAT,intel,NVIDIA等公司面试的题目记录 ...41-first-missing-positive 01-Two-Sum 求解第K
268| [Missing Number](https://leetcode.com/problems/missing-number/) | [C++](./C++/missing-number.cpp) [Python](./Python/missing-number.py) | _O(n)_ | _O(1)_ | Medium | LintCode || 318| [Maximum ...
缺失的第一个整数](./Array/first-missing-positive.md) [0042 接雨水](./Array/trapping-rain-water.md) [0048 旋转图像](./Array/rotate-image.md) Heap 堆 [0023 合并K个排序链表](./Heap/merge-k-sorted-lists....
收集面试中提出的一些重要问题。 数据结构算法面试问题面试中提出的一些重要问题的集合。 数组...missing-positive / https://leetcode.com/problems/container-with-most-water/ htt
股票买卖最佳时机leetcode Java项目 这是 ...First_Missing_Positive Generate_All_Parenthesis_2 实现_StrStr Largest_Distance_Between_Nodes_Of_A_Tree Largest_Rectangle_In_Histogram Least_C
First Missing Positive 计数排序 H-Index 基数排序 Maximum Gap 其他 Largest Number 小结 查找 Search for a Range Search Insert Position Search in Rotated Sorted Array Search in Rotated Sorted Array II ...