题意:
解题思路:
思路:交换位置法
1. 保证1出现在nums[0],2出现在nums[1]的位置上,n出现在nums[n-1]的位置上;
2. [3,4,-1,1]最终交换得到[1,-1,3,4];
3. 重新遍历[1,-1,3,4],找到第一个不在该位置的数:nums[i] != i + 1;
4. 最红循环到i = 1,正确结果应该是2,但数组中结果为-1,所以缺失的数字就是i + 1 = 2;
PHP代码实现:
class Solution {
function firstMissingPositive($nums) {
for ($i = 1; $i > 0; $i++) {
if (!in_array($i, $nums)) return $i;
}
}
function firstMissingPositive1($nums) {
if (!$nums) return 1;
for ($i = 0; $i < count($nums); $i++) {
while ($nums[$i] > 0 && $nums[$i] != $nums[$nums[$i] - 1]) {
$temp = $nums[$nums[$i] - 1];
$nums[$nums[$i] - 1] = $nums[$i];
$nums[$i] = $temp;
}
}
for ($i = 0; $i < count($nums); $i++) {
if ($nums[$i] != $i + 1) return $i + 1;
}
return count($nums) + 1;
}
}
GO代码实现:
func firstMissingPositive(nums []int) int {
n := len(nums)
for i := 0; i < n; i++ {
for nums[i] > 0 && nums[i] < n && nums[nums[i] - 1] != nums[i] {
nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
}
}
for i := 0; i < n; i++ {
if nums[i] != i + 1 {
return i + 1
}
}
return n + 1
}