参考题解:https://leetcode.cn/problems/first-missing-positive/solutions/7703/tong-pai-xu-python-dai-ma-by-liweiwei1419
难点在于时间复杂度控制在O(n)
,空间复杂度为常数级。
哈希表时间复杂度符合,但是空间复杂度为O(n)
排序空间复杂度符合,但是时间复杂度为O(nlogn)
于是,自己设定一个“哈希表”,规定正整数i
必须放在下标为i-1
的位置上,例如:nums[0]=1, nums[1]=2,...
,这样之后通过遍历这个“哈希表”,找到不符合上述规则的位置,从而找到缺失的第一个正数。
如何将nums
变换成上述的“哈希表”?通过交换。
class Solution {public int firstMissingPositive(int[] nums) {int len = nums.length;for (int i = 0; i < len; ++i) {while (nums[i] >= 1 && nums[i] <= len && nums[i] != nums[nums[i] - 1]) {swap(nums, i, nums[i] - 1);}}for (int i = 0; i < len; ++i) {if (nums[i] != i + 1) {return i + 1;}}return len + 1;}public void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}