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; }
相关推荐
java java_leetcode题解之First Missing Positive.java
c语言入门 C语言_leetcode题解之41-first-missing-positive.c
js js_leetcode题解之41-first-missing-positive.js
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 │ └── ...
本资源包聚焦于LeetCode的第41题——"缺失的第一个正数"(First Missing Positive)。这是一道中等难度的题目,旨在检验程序员对数组处理以及优化算法的能力。下面将详细探讨这个问题的解决方案、相关的C++编程技巧...
题:**First Missing Positive 给定一个未排序的整数数组,找到第一个缺失的正整数。 例如,给定 [1,2,0] 返回 3,而 [3,4,-1,1] 返回 2。 您的算法应该在 O(n) 时间内运行并使用恒定空间。 **第 0003 题:**String ...
2. **First Missing Positive**:这是一个关于数组处理的问题,要求找到数组中第一个缺失的正整数。它需要理解数组的特性并进行有效的遍历,可能使用到排序或哈希表等数据结构。 3. **Best Time to Buy and Sell ...
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_...
- First Missing Positive(缺失的第一个正数) - 2 Sum(两数之和) - 3 Sum(三数之和) - 3 Sum Closest(三数之和最接近) - Remove Duplicates from Sorted Array(删除有序数组中的重复项) - Remove ...
"First Missing Positive"是LeetCode中的一道经典问题,旨在考察我们对数组操作的理解以及对算法设计的能力。这个问题的标题是"第一个缺失的正数",其核心目标是从给定的未排序整数数组中找到最小的缺失正整数。 ...
- **数组中的第一个不重复的数字(First Missing Positive)**: 找出数组中缺失的第一个正数。 #### 排序算法 - **合并排序数组(Merge Sorted Array)**: 将两个排序数组合并成一个新的排序数组。 - **寻找数组中的中...
leetcode 2 code_interview leetcode和lintcode的一些题目的解法 是剑指offer 是面试中遇到的有意思的题目总结,比如说BAT,intel,NVIDIA等公司面试的题目记录 ...41-first-missing-positive 01-Two-Sum 求解第K
- First Missing Positive: 找出数组中缺失的最小正数。 - Trapping Rain Water: 给定一个数组,其中每个元素代表一个宽度为1的柱子高度,计算能接多少雨水。 - Multiply Strings: 给定两个非负整数字符串形式的数,...
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