使用场景
可以使用哈希表完成,但限制空间复杂度O(1),且数组元素和数组下标(0 ~ n-1或 1 ~ n)有关,可以使用原地哈希将数组当成哈希表:
1)数组中有0 或 没0时:
原地置换:
遍历数组时置换元素,使得 nums[i]=i(或nums[i]=i+1)。
比如:nums[0]=0(或1),nums[1]=1(或2),nums[2]=2(或3)……
2)数组中没0
遍历数组,遍历到元素 i 时,将对应的下标 i-1 上的元素nums[i-1]取反做标记;第二次遍历时,若nums[i]>0,则说明不存在元素 i+1 。
时间复杂度:O(n)。
Leetcode中这一类问题是数组范围(0,N)找寻重复数字或者消失的数字:
面试题03. 数组中重复的数字
Leetcode 41. 缺失的第一个正数
Leetcode 442. 数组中重复的数据
Leetcode 448. 找到所有数组中消失的数字
【思路】原地置换,使得nums[i]=i+1,当nums[i]超出范围或者重复时,放弃交换,遍历下一个元素。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n=nums.size();
for