【LeetCode】Recursion(共11题)
链接: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题)的更多相关文章
- 【sql】leetcode习题 (共 42 题)
[175]Combine Two Tables (2018年11月23日,开始集中review基础) Table: Person +-------------+---------+ | Column ...
- Leetcode 简略题解 - 共567题
Leetcode 简略题解 - 共567题 写在开头:我作为一个老实人,一向非常反感骗赞.收智商税两种行为.前几天看到不止两三位用户说自己辛苦写了干货,结果收藏数是点赞数的三倍有余,感觉自己的 ...
- LeetCode面试常见100题( TOP 100 Liked Questions)
LeetCode面试常见100题( TOP 100 Liked Questions) 置顶 2018年07月16日 11:25:22 lanyu_01 阅读数 9704更多 分类专栏: 面试编程题真题 ...
- WEB前端面试选择题解答(共36题)
第1题 ["1", "2", "3"].map(parseInt) A:["1", "2", &qu ...
- [LeetCode] 接雨水,题 Trapping Rain Water
这题放上来是因为自己第一回见到这种题,觉得它好玩儿 =) Trapping Rain Water Given n non-negative integers representing an eleva ...
- 剑指offer 面试11题
面试11题: 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4 ...
- 【LeetCode】堆 heap(共31题)
链接:https://leetcode.com/tag/heap/ [23] Merge k Sorted Lists [215] Kth Largest Element in an Array (无 ...
- 【LeetCode】排序 sort(共20题)
链接:https://leetcode.com/tag/sort/ [56]Merge Intervals (2019年1月26日,谷歌tag复习) 合并区间 Input: [[1,3],[2,6], ...
- 【LeetCode】数学(共106题)
[2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...
随机推荐
- Influxdb根据配置文件启动(Influxdb的数据存储)
1.在Influxdb文件夹下建立一个bat文件 2.文件内容如下: @echo offSETLOCAL :: 获取当前批处理所在路径SET InfluxdP==%~dp0 :: 开启influxdb ...
- CABasicAnimation来做心跳动画
CABasicAnimation *anim = [CABasicAnimation animation]; anim.keyPath = @"transform.scale"; ...
- Angular:OnPush变化检测策略介绍
在OnPush策略下,Angular不会运行变化检测(Change Detection ),除非组件的input接收到了新值.接收到新值的意思是,input的值或者引用发生了变化.这样听起来不好理解, ...
- FastDFS的安装及上传下载(二)
百度云:所有附件的地址 一 安装前的检查 检查Linux上是否安装了 gcc.libevent.libevent-devel,执行如下yum命令检查: [root@node02 ~]# yum lis ...
- Queue2链队列
链队列 1 #include <iostream> using namespace std; template <class T> class Queue { private: ...
- spring+JdbcTemplate简单使用(一)
目录 @ 1. 环境配置 maven(项目管理) idea(编译器) jdk1.8(Java环境) MySQL5.6(MySQL数据库) 2. 创建项目 在 idea 中创建普通的 maven 项目 ...
- Spring Boot学习第一部分(Spring 4.x)第一章(Spring 基础)
1.spring概述 1.1.spring的简史 第一阶段:XML配置spring 1.x时代, 第二阶段:注解配置spring 2.x时代, @Controller @Service @Compon ...
- 初步学习JS中的闭包
JS高级程序设计(3rd)中对闭包的定义就是一句话,首先闭包是一个函数,怎样的函数呢?有权访问另一个函数作用域中的变量 的函数.而创建闭包的常见方式就是在一个函数的内部创建另一个函数,就是嵌套函数. ...
- git清空远程仓库
需求背景:因为用jenkins连接了git仓库,有时候job构建出现问题,需要排查问题,但是呢,真实的项目代码量非常pang大,所以就需要建1个测试仓库,使用最少量的代码能复现自己的问题就好. 这就需 ...
- npm install 安装不成功,提示python2.7
npm install 安装不成功的原因 是因为缺少python的环境 解决方法: 1.去官网下载https://www.python.org/download/releases/2.7/ 2.安装成 ...