判断核心:递归实现组合型枚举
1. 处理数据
将每个给定的数字拆分成单个的数字放到一个vector里面去,最后用一个大的vector包含所有的数字组
int solution(vector<int> numbers){
vector<vector<int>> digits;
for(int num : numbers){
vector<int> groupdigits;
while(num > 0){
groupdigits.push_back(num % 10);
num /= 10;
}
digits.push_back(groupdigits);
}
}
2.实现递归函数
这里有一个很大的问题,就是我原本是把递归函数写在外面,总的方案数cnt定义成全局,然后在solution里面调用递归函数。这样做的话执行单个输出语句都是对的,但是这道题是一次性执行完所有的样例。
也就是说之前的cnt会一直存在并且影响后面的递归
于是我们需要每一次调用solution都有一个单独的cnt和单独的递归调用
那么问题就来了,我们如何在一个函数内部定义一个可以执行的函数,并且让它能访问并修改到外部的变量呢?
function<void(int,int)> backtrack = [&](int index, int sum){
}
- function<void(int,int)> 是用来声明backtrack的类型
- [&](int index, int sum):lambda表达式
lambda 表达式,用于定义一个匿名函数,这个匿名函数就是实际被赋值给 backtrack 的可调用对象内容
[&] 表示这个 lambda 表达式通过引用捕获外部作用域中的变量。也就是说,在 lambda 表达式内部可以直接访问和修改它所在的外部函数作用域里的变量
贴一个完整代码:
#include <functional>
#include <iostream>
#include <vector>
using namespace std;
int solution(vector<int> numbers) {
vector<vector<int>> digits;
// Please write your code here
for(int num : numbers){
vector<int> groupDigits;
while(num > 0){
groupDigits.push_back(num%10);
num /= 10;
}
digits.push_back(groupDigits);
}
int cnt = 0;
function<void(int, int)> backtrack = [&](int index, int sum){
//已经选到最后一个数字组了
if(index == digits.size()){
if(sum % 2 == 0){
cnt++;
}
return;
}
//如果没有选到最后一个数字组就会执行以下代码
//枚举每一个数字组里面的数字
for(int digit : digits[index]){
//到下一个数字组里面去选数字
//这里枚举是包含每个数字都被选的情况
backtrack(index+1, sum+digit);
}
};
backtrack(0, 0);
return cnt;
}
int main() {
// You can add more test cases here
cout << solution({123, 456, 789})<< endl;
cout << solution({123456789})<< endl;
cout << solution({14329, 7568}) << endl;
return 0;
}
标签:digits,index,num,backtrack,AI,int,vector,豆包,刷题
From: https://blog.csdn.net/ixxoic/article/details/143876955