leetcode_数组_相关内容2(

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;   
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值