您的位置:首页 > 其它

leetcode_数组_相关内容2(

2015-05-15 19:25 344 查看
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: