由于手滑
DAY7的没保存
假装DAY7已经上传了。
BM52 数组中只出现一次的两个数字
class Solution {
private:
int a[1000001];
vector<int> b;
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
memset(a,0,sizeof(a));
for(int i=0;i<array.size();i++){
a[array[i]]++;
}
for(int i=0;i<1000001;i++){
if(a[i]==1){
b.push_back(i);
}
}
return b;
}
};
BM53 缺失的第一个正整数
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int minNumberDisappeared(vector<int>& nums) {
// write code here
sort(nums.begin(), nums.end());
int k=1;
for(int i=0;i<nums.size();i++){
if(nums[i]<=0){
continue;
}else if(nums[i]==k){
k++;
}else{
return k;
}
}
return k;
}
};
BM54 三数之和
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& num) {
vector<vector<int>> ans;
if (num.size() < 3) //个数不满足的时候明显不符合要求,返回结果。
return ans;
sort(num.begin(), num.end()); //对给定的数组进行排序
for (int i = 0; i < num.size() - 2; i++) //-2是因为保证从i开始剩下的数组长度>=3
{
if (num[i] > 0) //基准值大于0 ,后面查找的两个数肯定不存在。
break;
int j = i+1, k = num.size() - 1; //j从i后面的第一个数开始尝试,k从数组最后一个位置开始尝试
int target = -num[i]; //寻找两个数相加为target
while (j<k)
{
if (num[j] + num[k] < target) //说明寻找的两个数比目标值小,所以尝试更大的一种情况。
j++;
else if (num[j] + num[k] > target)//说明比目标值大,尝试更小的一种情况
k--;
else //相等的状况。
{
vector<int> temp = {num[i],num[j],num[k]};
ans.push_back(temp);
//target=num[j]+num[k] target一定时,确定了num[j]、num[k] 其中一个那么另外一个就确定了 那么得到的肯定就会重复
//所以下面两行代码是为了去掉当target一定时 重复的情况
while (num[j] == num[j + 1] && j+1<k) j++;
while (num[k] == num[k - 1] && k-1>j) k--;
++j; --k; //相等的话这两个数就不再使用了(已经用过了)。
}
}
//为了去除target重复的情况,试想一下,当num[i]=x的时候, i后面所有相加=-x 的两个数已经全部求出来了。
//那再求i+1 后面的必然是上面所求的子集。 这里依旧还是需要判断i,因为防止后面再次判断num[i+1]的时候产生越界。
while (num[i] == num[i + 1] && i < num.size() - 2) i++;
}
return ans;
}
};
BM55 没有重复项数字的全排列
class Solution {
public:
void recurion(vector<vector<int>>& res,vector<int>& num,int index){
if(index==num.size()-1)
res.push_back(num);
else{
for(int i=index;i<num.size();i++){
swap(num[i],num[index]);
recurion(res,num, index+1);//每次递归index增加,避免重复排列
swap(num[i], num[index]);
}
}
}
vector<vector<int> > permute(vector<int> &num) {
sort(num.begin(), num.end());
vector<vector<int>> res;
recurion(res, num, 0);
return res;
}
};
BM56 有重复项数字的全排列
class Solution {
public:
void recurion(vector<vector<int>>& res,vector<int>& num,int index){
if(index==num.size()-1)
res.push_back(num);
else{
for(int i=index;i<num.size();i++){
swap(num[i],num[index]);
recurion(res,num, index+1);//每次递归index增加,避免重复排列
swap(num[i], num[index]);
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(), num.end());
vector<vector<int>> res;
recurion(res,num,0);
sort(res.begin(), res.end());//对结果进行排序,排序后进行去重操作,利用unique函数进行去重操作。
res.erase(unique(res.begin(), res.end()), res.end());
return res;
}
};
- 本文链接:https://archer-lan.github.io/2022/03/26/%E7%89%9B%E5%AE%A2%E5%88%B7%E9%A2%98-DAY8/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。