链接:https://leetcode.com/tag/recursion/

247 Strobogrammatic Number II (2019年2月22日,谷歌tag)

给了一个 n,给出长度为 n 的所有上下颠倒 180度以后都看起来一样的数字字符串。

题解:dfs,回溯。注意所有的能有pair的序列是 0, 1, 8, 6, 9

 class Solution {
public:
vector<string> findStrobogrammatic(int n) {
vector<pair<string, string>> digits{{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""}};
vector<string> res;
if (n & ) {
vector<string> list = {"", "", ""};
for (int i = ; i < ; ++i) {
string s = list[i];
dfs(res, s, digits, n);
}
} else {
string s = "";
dfs(res, s, digits, n);
}
return res;
}
void dfs(vector<string>& res, string& s, vector<pair<string, string>>& digits, const int n) {
if (s.size() == n) {
if (s[] != '' || s == "") {
res.push_back(s);
}
return;
}
for (auto& p : digits) {
string s1 = p.first, s2 = p.second;
string oriS = s;
s = s1 + s + s2;
dfs(res, s, digits, n);
s = oriS;
}
}
};

248 Strobogrammatic Number III (2019年1月17日,谷歌高频)

给了两个字符串一个low,一个high,找出 low 和 high 之间所有的 strobogrammatic number 的数量。strobogrammatic number 是说一个数字上下颠倒180度之后看起来一样

题解:找出所有上下颠倒看起来一样的数字。有 0, 1, 8, 69, 和 96, 我们可以用这些number做recursion。每次在两边加上这些数字。就能生成一个上下颠倒后看起来一样的数。

 class Solution {
public:
int strobogrammaticInRange(string low, string high) {
if (low.size() > high.size() || low.size() == high.size() && low > high) {
return ;
}
this->low = low, this->high = high;
vector<string> start = {"", "", "", "", "", ""};
for (auto s : start) {
dfs(s);
}
return ret.size();
}
void dfs(string s) {
if (check(s)) {
ret.insert(s);
}
if (s.size() <= high.size()) {
for (int i = ; i < model.size(); ++i) {
string pre = model[i].first, suff = model[i].second;
dfs(pre + s + suff);
}
}
if (s > high) {
return;
}
}
bool check(string s) {
if (s.empty() || s.size() > && s[] == '' ) {
return false;
}
if (low.size() == high.size()) {
return s.size() == low.size() && s >= low && s <= high;
} else {
if (s.size() > low.size() && s.size() < high.size()) {
return true;
} else if (s.size() == low.size()) {
return s >= low;
} else if (s.size() == high.size()) {
return s <= high;
}
return false;
}
return false;
}
set<string> ret;
vector<pair<string, string>> model = {{"",""}, {"",""}, {"",""}, {"",""}, {"",""}};
string low, high;
};

544 Output Contest Matches(2019年2月22日,谷歌tag)

给定一个 n,假设 n 只队伍比赛(n是2的幂),我们每次安排比赛要把最强的队伍和最弱的队伍安排在一起。给出最后比赛的排列字符串。

Input: 8
Output: (((1,8),(4,5)),((2,7),(3,6)))
Explanation:
First round: (1,8),(2,7),(3,6),(4,5)
Second round: ((1,8),(4,5)),((2,7),(3,6))
Third round: (((1,8),(4,5)),((2,7),(3,6)))
Since the third round will generate the final winner, you need to output the answer (((1,8),(4,5)),((2,7),(3,6))).

题解:本题看起来比较复杂,但是其实仔细研究一下,我们只需要把所有team的编号放在一个数组里面,把第一个和最后一个组队形成pair,第二个和倒数第二个组队形成pair,生成新的数组,然后调用dfs递归生成即可。

 class Solution {
public:
string findContestMatch(int n) {
vector<string> pairs(n);
for (int i = ; i < n; ++i) {
pairs[i] = to_string(i+);
}
dfs(pairs);
return pairs[];
}
void dfs(vector<string>& pairs) {
if (pairs.size() == ) {return;}
int start = , end = pairs.size() - ;
vector<string> newPairs;
while (start < end) {
string str = "(" + pairs[start++] + "," + pairs[end--] + ")";
newPairs.push_back(str);
}
pairs = newPairs;
dfs(pairs);
}
};

625 Minimum Factorization(2019年2月22日)

给了一个正整数a,返回一个最小的正整数b,b中所有数位的乘积等于a。

题解:dfs,backtracking. 很慢,本题可以数学方法。

 class Solution {
public:
int smallestFactorization(int a) {
if (a == ) {return ;}
string s;
dfs(a, s);
return hasAns ? res : ;
}
bool hasAns = false;
int res = INT_MAX;
void dfs(int a, string& s) {
if (a == ) {
long long temp = stoll(s);
if (s.size() <= && temp <= INT_MAX) {
hasAns = true;
res = min(res, stoi(s));
}
return;
}
for (int i = ; i > ; --i) {
if (a % i == && s.size() + <= to_string(res).size()) {
s.push_back(i + '');
dfs(a/i, s);
s.pop_back();
}
}
}
};

687 Longest Univalue Path

698 Partition to K Equal Sum Subsets (2019年2月24日,谷歌tag)

本题和 544 Output Contest Matches 拼火柴棍的这个题非常类似。基本一模一样。

给了一个数组nums,一个k,问这个数组能不能划分成 k 个总和大小相等的子集。每个数组元素只能用一次,并且必须用掉。

题解:dfs。

 class Solution {
public:
bool canPartitionKSubsets(vector<int>& nums, int k) {
this->k = k;
size = nums.size();
if (size == ) {return false;}
int tot = ;
sort(nums.begin(), nums.end(), greater<int>()); //从大到小排列
for (auto& num : nums) {
tot += num;
}
if (tot % k) {return false;}
const int length = tot / k;
vector<int> visit(size, );
return dfs(nums, visit, , , length, );
}
int size = , k = ;
bool dfs(const vector<int>& nums, vector<int>& visit, int curLen, int cnt, const int target, int start) {
if (cnt == k) {return true;}
for (int i = start; i < size; ++i) {
if (visit[i]) {continue;}
if (curLen + nums[i] > target) {continue;}
visit[i] = ;
bool res = false;
if (curLen + nums[i] == target) { //如果当前这个子集的元素的和等于target,就去寻找下一个子集。
res = dfs(nums, visit, , cnt + , target, );
} else if (curLen + nums[i] < target) {
res = dfs(nums, visit, curLen + nums[i], cnt, target, i + ); //如果当前这个子集的元素的和小于target,就继续递归找当前子集的其他元素。
}
visit[i] = ;
if (res) {
return res;
}
}
return false;
}
};

726 Number of Atoms

761 Special Binary String

779 K-th Symbol in Grammar(2019年2月22日,谷歌tag)(和群主mock的那题非常相似。)

当 N = 1 的时候,字符串为 “0”,每当 N 递增1,就把上一个字符串的 “0” 变成 “01”, 把上一个字符串的“1”变成“10”。返回第N个字符串的第K个字符。

题解:我们这题用递归解。我们先求出当前字符串的第 K 个字符是由前一个字符串的字符是 0 还是 1 生成的,然后根据前一个字符,做一点逻辑判断,判断出当前字符是 0 还是 1。

 class Solution {
public:
int kthGrammar(int N, int K) {
if (N == ) {return ;}
int preNumber = kthGrammar(N-, (K+)/);
int res = -;
if (preNumber == ) { //
res = K & ? : ;
} else if (preNumber == ){ //
res = K & ? : ;
}
return res;
}
};

794 Valid Tic-Tac-Toe State

894 All Possible Full Binary Trees

【LeetCode】Recursion(共11题)的更多相关文章

  1. 【sql】leetcode习题 (共 42 题)

    [175]Combine Two Tables (2018年11月23日,开始集中review基础) Table: Person +-------------+---------+ | Column ...

  2. Leetcode 简略题解 - 共567题

    Leetcode 简略题解 - 共567题     写在开头:我作为一个老实人,一向非常反感骗赞.收智商税两种行为.前几天看到不止两三位用户说自己辛苦写了干货,结果收藏数是点赞数的三倍有余,感觉自己的 ...

  3. LeetCode面试常见100题( TOP 100 Liked Questions)

    LeetCode面试常见100题( TOP 100 Liked Questions) 置顶 2018年07月16日 11:25:22 lanyu_01 阅读数 9704更多 分类专栏: 面试编程题真题 ...

  4. WEB前端面试选择题解答(共36题)

    第1题 ["1", "2", "3"].map(parseInt) A:["1", "2", &qu ...

  5. [LeetCode] 接雨水,题 Trapping Rain Water

    这题放上来是因为自己第一回见到这种题,觉得它好玩儿 =) Trapping Rain Water Given n non-negative integers representing an eleva ...

  6. 剑指offer 面试11题

    面试11题: 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4 ...

  7. 【LeetCode】堆 heap(共31题)

    链接:https://leetcode.com/tag/heap/ [23] Merge k Sorted Lists [215] Kth Largest Element in an Array (无 ...

  8. 【LeetCode】排序 sort(共20题)

    链接:https://leetcode.com/tag/sort/ [56]Merge Intervals (2019年1月26日,谷歌tag复习) 合并区间 Input: [[1,3],[2,6], ...

  9. 【LeetCode】数学(共106题)

    [2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...

随机推荐

  1. postman接口自动化测试之如何使用)

    postman 是一款强大网页调试工具的客户端,postman为用户提供强大的 Web API & HTTP 请求调试功能.postman能够发送任何类型的HTTP 请求 (GET, HEAD ...

  2. NVMe固态硬盘工具箱使用说明

    https://www.bilibili.com/read/cv562989/ 浦科特NVMe固态硬盘工具箱使用说明 数码 2018-6-7 687阅读7点赞3评论 浦科特已经推出针对NVMe固态硬盘 ...

  3. c# 生成文件目录树

    class Program { //遍历目录名含有M00到M11的目录 //生成文件目录树(去除文件名中含有scc\Designer\designer\resx的文件) //生成的文件保存在D:\\a ...

  4. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 I. Reversion Count (java大数)

    Description: There is a positive integer X, X's reversion count is Y. For example, X=123, Y=321; X=1 ...

  5. 基于ES6的tinyJquery

    原文地址:Bougie的博客 jQuery作为曾经Web前端的必备利器,随着MVVM框架的兴起,如今已稍显没落.但它操作DOM的便利性无出其右.我用ES6写了一个基于class简化版的jQuery,包 ...

  6. (转)CoreDNS介绍

    转:https://www.colabug.com/4171614.html 本文介绍 CoreDNS 相关配置以及验证方法,实验环境为 Kubernetes 1.11,搭建方法参考 kubeadm安 ...

  7. (转)k8s集群部署二:flannel网络

    转:https://blog.csdn.net/sinat_35930259/article/details/79946146 Overlay Network模式 覆盖网络,在基础网络上叠加的一种虚拟 ...

  8. JS对象、原型、this学习总结

    1.对象是函数创建的,而函数却又是一种对象.(属性的集合) 2.每个函数都有一个属性叫做prototype.这个prototype的属性值是一个对象,默认的只有一个constructor的属性,指向这 ...

  9. MySql使用mysqldump 导入与导出方法总结

    导出数据库数据:首先打开cmd进入MySQL的bin文件夹下 1.导出education数据库里面的users表的表数据和表结构(下面以users表为例) mysqldump -u[用户名] -h[i ...

  10. 常见的网络设备:集线器 hub、网桥、交换机 switch、路由器 router、网关 gateway

    Repeater 中继器 Hub 集线器 bridge 网桥 switch 交换机 router 路由器 gateway 网关 网卡 参考资料: do-you-know-the-differences ...