题目描述
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
题解
数值信息转移到位置信息上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| int firstMissingPositive(vector<int>& nums) { int pos = 0; int len = nums.size(); while (pos < len) { if (nums[pos] <= 0) nums[pos] = len + 2; ++pos; } pos = 0; while (pos < len) { int t = abs(nums[pos]); if (t<=len) nums[t - 1] = -abs(nums[t - 1]); ++pos; } pos = 0; while (pos < len) { if (nums[pos]>0) return pos + 1; ++pos; } return len + 1; }
|
若没有时间的限制,可以直接排序后遍历查找。
若没有空间的限制,可以创建辅助空间后记录。