同 LeetCode 2890,此處給出更直觀的圖解與另一種寫法。
遍歷數組,對於每個 nums[i],若其在 [1, n] 範圍內且不在正確位置(即 nums[nums[i]-1] != nums[i]),則交換至正確位置。重複直到當前位置滿足停止條件。
class Solution {
public:
int firstMissingPositive(vector& nums) {
int n = nums.size();
for (int i = 0; i < n; ++i) {
while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
swap(nums[nums[i] - 1], nums[i]);
}
}
for (int i = 0; i < n; ++i) {
if (nums[i] != i + 1) return i + 1;
}
return n + 1;
}
};

圖示展示了 [3,4,-1,1] 如何通過交換變為 [1,-1,3,4],最終發現索引 1 處值為 -1 ≠ 2,返回 2。
nums[nums[i]-1] != nums[i] 避免死循環[1, n],其他值原地停留