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