首页 > 其他分享 >力扣-77-组合

力扣-77-组合

时间:2022-12-07 21:56:29浏览次数:80  
标签:77 return 组合 temp index int res 力扣 backTrace

直达链接

这个问题应该就是我想找的答案了,把k=1~n全部输出一遍
然后如果k=n,那就是全排列问题不对,还是不一样,这里只考虑数字组合,而没考虑数字顺序也就是排列问题

两种解法,第一种是枚举(选和不选两种情况),而且听说可以写for和不写两种写法(有待验证)

而方法二还是采用类似于子序列的生成01序列然后匹配的做法

2022-12-7重做

使用回溯的是全排列,这个不太一样,这个是组合

评论区提醒是:同样可以用回溯,只不过排列每次都是从头开始,需要记录已经访问过的元素,而组合不需要,组合只需要在本次选择后面的元素中进行下一次选择

由这个朴素的思路,写出的代码:

class Solution {
public:
	vector<vector<int>> res;

	void backTrace(vector<int>& temp, int n, int k, int index) {
		if (temp.size() == k) {
			res.push_back(temp);
			return;
		}
                // 这里不要刻意控制右边界
		for (int i = index; i <= n; i++) {
			temp.push_back(i);
			backTrace(temp, n, k, i + 1);
			temp.pop_back();
		}
	}
	vector<vector<int>> combine(int n, int k) {
		vector<int> temp;
		backTrace(temp, n, k, 1);
		return res;
	}
};

去比对了一下两个月前的的代码,有两点注意:

  1. 做了一个剪枝,这个剪枝的效果有多大?大概是if (temp.size() + n - index + 1 < k) return;就是我之前想要通过控制右边界却错了做法的想法
  2. temp能定义为类变量吗?可以


效果出乎意料的显著,是幻觉吗?!

class Solution {
public:
	vector<vector<int>> res;
	vector<int>temp;

	void backTrace(int n, int k, int index) {
		if (temp.size() + n - index + 1 < k) return;
		if (temp.size() == k) {
			res.push_back(temp);
			return;
		}
		for (int i = index; i <= n; i++) {
			temp.push_back(i);
			backTrace(n, k, i + 1);
			temp.pop_back();
		}
	}
	vector<vector<int>> combine(int n, int k) {
		backTrace(n, k, 1);
		return res;
	}
};

标签:77,return,组合,temp,index,int,res,力扣,backTrace
From: https://www.cnblogs.com/yaocy/p/16744484.html

相关文章

  • 力扣 leetcode 1775. 通过最少操作次数使数组的和相等
    问题描述给你两个长度可能不等的整数数组nums1和nums2。两个数组中的所有值都在1到6之间(包含1和6)。每次操作中,你可以选择任意数组中的任意一个整数,将它变成......
  • 算法练习:排列组合之子集合
    问题描述输入一个含有不同数字的序列,输出其所有子集合(含空集)。要求:1)集合里元素有序排列;2)输出结果不含有重复集合 举例输入序列{3,1,2}输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} 问......
  • 算法练习:排列组合之全排列
    问题描述输入一个不含相同数字的序列,输出所有可能的排列。 问题分析与之前的“求解子集合”类似,使用递归方法:典型的在for循环内调用递归函数。不同的是,必须等到所有的数字......
  • 算法练习:排列组合之组合和
    问题描述给出一组不同的正整数序列和一个目标值,求出所有可能的组合,使得组合里所有元素和为目标值。要求:1)每个组合里的元素按照升序排列。2)输出组合里不含有重复的组合。3)输......
  • GUI-6-练习代码组合框及按钮-2022-12-7
    packagecom.lr.guifirstdemo;importjava.awt.*;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclasstestDemo05{publicstatic......
  • 力扣540(java&python)-有序数组中的单一元素(中等)
    题目:给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足O(logn)时间复......
  • [LeetCode] 1775. Equal Sum Arrays With Minimum Number of Operations
    Youaregiventwoarraysofintegers nums1 and nums2,possiblyofdifferentlengths.Thevaluesinthearraysarebetween 1 and 6,inclusive.Inoneoper......
  • S1 - Lesson 77 - 78
    Wordsappointmentappointmakeanappointmentdatehaveadatehaveanappointmentwiththedoctorat10:30 urgenturgencyIncaseofurgency,callthepoli......
  • 力扣12 数字转为罗马数字
    力扣12数字转为罗马数字题目:罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C......
  • A组合方案 (n个选m个)
    递归实现组合型枚举从1∼n这n个整数中随机选出m个,输出所有可能的选择方案。输入格式两个整数n,m,在同一行用空格隔开。输出格式按照从小到大的顺序输出所有方......