题目描述:
解题思路:
这道题的解法很巧妙。首先思考一种边界情况,假如所有值都是有效值,即都是正整数并且连续,那么最大值就是数组的长度加一,否则但凡出现一个无效值,那么最大值都小于数组的长度。基于这个可以想到开辟一个与原数组长度相同的数组,假设长度表示为n。把所有值在(1,n)之间的数装进数组,没有装入的位置默认值为0,最后只用判断第一个出现0的坐标,就可以得知缺少的最小值。如果数组中没有0,就说明最小值是n+1。其实数组的元素只需要一位就够了,有对应元素为1,反之为0,同样可行。
但是这道题要求空间复杂度为O(1),所以还需要进一步的思考。其实不需要开辟一块同样长度的数组,直接在原数组上操作就行。每次把值swap到对应坐标的元素上,直到所有元素都归位。最后和之前一样遍历这个数组,第一个元素值与坐标不符的就是答案,最小值为坐标加1。如果都符合,则最小值为数组长度加1。
注意判断特殊情况,避免死循环。
代码如下:
class Solution { public: int firstMissingPositive(vector<int>& nums) { for (int i = 0; i < nums.size(); ++i) { while (nums[i] != (i + 1) && nums[i] > 0 && nums[i] <= nums.size() && nums[i] != nums[nums[i] - 1]) swap(nums[i], nums[nums[i] - 1]); } int i = 0; for ( ; i < nums.size(); ++i) if (nums[i] != i + 1) break; if (i == nums.size()) return nums.size() + 1; else return i + 1; } };