1. 169 Majority Element 传送门:https://leetcode.com/problems/majority-element/
大意:求出出现次数最多的数。
题解:少见的官方给出了题解,并提供了多种思路。建议都试一试。传送门:https://leetcode.com/problems/majority-element/solution/
AC代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
//divide and conquer
int left=0,right=nums.size()-1;
sort(nums.begin(),nums.end());
return nums[nums.size()/2];
}
};
2. 75 Sort Colors 传送门:https://leetcode.com/problems/sort-colors/
大意:按照颜色进行分类。排序。
题解:我的思路非常不正规。在discuss里也说了只是plusing meghod。会在下次更新时想出更好的办法。
AC代码:
class Solution {
public:
void sortColors(vector<int>& nums) {
int num1=0,num2=0,num3=0;
int i,j,k;
for(i=0;i<nums.size();i++)
{
if(nums[i]==0) num1++;
else if(nums[i]==1) num2++;
else num3++;
}
//nums.clear();
for(i=0;i<num1;i++)
nums[i]=0;
for(j=num1;j<(num1+num2);j++)
nums[j]=1;
for(k=num2+num1;k<(num3+num2+num1);k++)
nums[k]=2;
}
};
3. 78 subsets 传送门: https://leetcode.com/problems/subsets/
大意:求出子集。
题解:这道题的tag里包含了back-tracking。这一类题都可以用for循环进行dfs来解决,在dfs语句前加入要执行的这次元素,dfs语句后再弹出。
这一次的for循环指明了下一次循环从哪儿开始。
AC代码:
class Solution {
public:
void solve(int index,int cur,vector<int> &res,vector<vector<int> >&ans,vector<int>& num)
{
ans.push_back(res);
for(int i=cur;i<num.size();i++)
{
res.push_back(num[i]);
//index++;
solve(index+1,i+1,res,ans,num);
res.pop_back();
}
}
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > ans;
vector<int> res;
//vector<int> num;
sort(S.begin(),S.end());
solve(0,0,res,ans,S);
return ans;
}
};
4. 90 subsets|| https://leetcode.com/problems/subsets-ii/
大意:给出的数组里可能会含有相同的元素,仍然需要生成子集。
题解:这里有两种思路:一种是允许生成含有相同元素的子集,但不加入最终的答案中,需要添加一个判断函数这种方法耗费的时间复杂度较大;
另一种是不允许包含相同的元素。
AC代码:
class Solution {
public:
bool check(vector<int> &s,vector<vector<int> >&ans)
{
for(int k=0;k<ans.size();k++)
if(ans[k]==s) return false;
return true;
}
void solve(int index,int cur,vector<int> &res,vector<vector<int> >&ans,vector<int>& num)
{
if(check(res,ans))
ans.push_back(res);
for(int i=cur;i<num.size();i++)
{
res.push_back(num[i]);
//index++;
solve(index+1,i+1,res,ans,num);
res.pop_back();
}
}
vector<vector<int> > subsetsWithDup(vector<int> &S) {
vector<vector<int> > ans;
vector<int> res;
//vector<int> num;
sort(S.begin(),S.end());
solve(0,0,res,ans,S);
return ans;
}
};
5. 39 Combination Sum
https://leetcode.com/problems/combination-sum/
大意:要求生成的子集之和等于给定的数值。
题解:仍然是用回溯的方法。
AC代码:
class Solution {
public:
void solve(vector<int>& res,vector<vector<int> >& ans,vector<int>& candidates,int cur,int sum,int target)
{
if(sum==target) {ans.push_back(res);return;}
for(int i=cur;i<candidates.size();i++)
{
if(sum+candidates[i]<=target)
{ res.push_back(candidates[i]);
solve(res,ans,candidates,i,sum+candidates[i],target);
res.pop_back();
} }
}
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
vector<vector<int> > ans;
vector<int> res;//rest
solve(res,ans,candidates,0,0,target);
return ans;
}
};