难度:困难
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0] 输出: 3
示例 2:
输入: [3,4,-1,1] 输出: 2
示例 3:
输入: [7,8,9,11,12] 输出: 1
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
题目解析:
本题主要有一个要求,时间复杂度为O(n),并且只能使用常数级别的额外空间。那么显然就不能使用排序算法了。这里使用自建哈希表的算法,将数组中的数进行规范化,下标0对应数字1,下标1,对应数字2,以此类推。。。
参考代码:
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <deque>
#include <stack>
#include <algorithm>
#include <map>
using namespace std;
class Solution {
public:
int firstMissingPositive(vector<int> &nums) {
int len = nums.size();
for (int i = 0; i < len; i++)
{
//自建哈希表,规则为下标0对应数值1,下标1对应数值2。。。
//自建的哈希表范围在1-len之间,不在这个范围内的,不要理它
//将当前数num调换到num-1的位置
while (nums[i] > 0 && nums[i] < len && nums[nums[i] - 1] != nums[i])
{
swap(nums[i], nums[nums[i]-1]);
}
}
//第一个与下标不对应的数,就是缺失的那个数
for (int j = 0; j < len; j++)
{
if (nums[j] != j + 1)
return j + 1;
}
return len + 1;
}
};
int main()
{
Solution solution;
vector<int> candidates = { 0,3,5,1,1 };
cout << solution.firstMissingPositive(candidates) << endl;
system("pause");
return 0;
}