Go寫的第一道leetcode,我感覺很🦚驕傲哇~
題目
- 缺失的第一個正數
給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
提示:
你的算法的時間複雜度應爲O(n),並且只能使用常數級別的額外空間。
思路
- 把每個元素放到自己的位置上,比如1放在index=0的位置,已經處理過的元素值改爲-1
- 時間複雜度是n,空間複雜度是常數
代碼
go語言
func firstMissingPositive(nums []int) int {
if len(nums)==0 {
return 1
}
for {
startIndex := -1
var curV int
for i:=0; i< len(nums);i++ {
if nums[i] < 1 || nums[i] > len(nums) {
continue
}
if nums[i] != i+1 {
startIndex = i
curV = nums[i]
}
}
if startIndex == -1 {
break
}
nums[startIndex] = -1
for {
if curV < 1 || curV > len(nums) {
break;
}
temp := nums[curV-1]
if temp == curV {
break;
}
nums[curV-1] = curV;
curV = temp;
}
}
for i :=0; i < len(nums); i++ {
if nums[i] != i+1 {
return i+1
}
}
return len(nums)+1;
}
c++語言
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
if (nums.size() == 0)
return 1;
if (nums.size() == 1)
return nums[0]==1?2:1;
while(true) {
int startIndex = -1;
int curV;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] < 1 || nums[i] > nums.size())
continue;
if (nums[i] != i+1) {
startIndex = i;
curV = nums[i];
break;
}
}
if (startIndex == -1)
break;
//cout << startIndex << " " << curV << endl;
nums[startIndex] = -1;
while (true) {
if (curV < 1 || curV > nums.size())
break;
int temp = nums[curV-1];
if (curV == temp)
break;
nums[curV-1] = curV;
curV = temp;
}
}
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != i+1)
return i+1;
}
return nums.size()+1;
}
};
debug
- 忘記第一個找到的startIndex值設置成1
- 木有考慮極端情況哈哈,nums的大小=0