1、找出重复的数
给定一个包含n个数的数组,其数字在1到n之间(包括1和n),可知至少存在1个重复的数,且每个重复的数只重复1次,找出重复的数。
要求,时间复杂度O(n),空间复杂度O(1)。
思路:
-
将数组进行排序,即nums[i]=i,由于这里的数范围是1-n,所以对应存储为 nums[i]=i+1,例如nums[0]=1,nums[1]=2…
-
最后对数组进行遍历,找出nums[i] != i+1的nums[i]。需要在排序完之后遍历,不能在排序的时候遍历,容易把一个数多次添加到结果集中。
代码:
vector<int> findSecondValue(vector<int> nums)
{
vector<int> res;
int i = 0,tmp;
while (i < nums.size()) //使用while,方便控制i
{
if (nums[i] != i+1)
{
if (nums[nums[i]-1] != nums[i]) //排序,即将nums[i]放到它该在的位置nums[nums[i]-1]
{
tmp = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = tmp;
}
else {
i++;
}
}
else {
i++;
}
}
for (int i = 0; i < nums.size(); i++) //最后一次遍历,找出重复的数
{
if (nums[i] != i+1)
{
res.push_back(nums[i]);
}
}
return res;
}
int main()
{
vector<int> nums{ 4,3,1,2,2,1,5,5 };
vector<int> res=findSecondValue( nums);
return 0;
}
2、41. 缺失的第一个正数
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
思路:
同上题相同。
代码:
int firstMissingPositive(vector<int>& nums) {
int i=0,tmp;
while(i<nums.size())
{
if(nums[i]<=0)
{
i++;
continue;
}
if(nums[i]!=i+1)
{
if( nums[i]-1< nums.size() && nums[nums[i]-1]!=nums[i] )
{
tmp=nums[nums[i]-1];
nums[nums[i]-1]=nums[i];
nums[i]=tmp;
}else{
i++;
}
}else{
i++;
}
}
int res=nums.size()+1; //若刚好从前到后都有,则返回n+1
for(int i=0;i<nums.size();i++)
{
if(nums[i]!=i+1 )
{
res=i+1;
break;
}
}
return res;
}