A. K-th Symbol in Grammar

Description

On the first row, we write a 0. Now in every subsequent row, we look at the previous row and replace each occurrence of 0 with 01, and each occurrence of 1 with 10.

Given row N and index K, return the K-th indexed symbol in row N. (The values of K are 1-indexed.) (1 indexed).

Example:
row 1: 0
row 2: 01
row 3: 0110
row 4: 01101001

思路

递归

Code

class Solution {
public:
int kthGrammar(int N, int K) {
if (N==1) return 0;
return kthGrammar(N-1, (K+1)/2) ? ((K%2)? 1 : 0) : ((K%2) ? 0 : 1);
}
};

B. Split BST

Description

Given a Binary Search Tree (BST) with root node root, and a target value V, split the tree into two subtrees where one subtree has nodes that are all smaller or equal to the target value, while the other subtree has all nodes that are greater than the target value. It's not necessarily the case that the tree contains a node with value V.

Additionally, most of the structure of the original tree should remain. Formally, for any child C with parent P in the original tree, if they are both in the same subtree after the split, then node C should still have the parent P.

You should output the root TreeNode of both subtrees after splitting, in any order.

Example 1:

Input: root = [4,2,6,1,3,5,7], V = 2
Output: [[2,1],[4,3,6,null,null,5,7]]
Explanation:
Note that root, output[0], and output[1] are TreeNode objects, not arrays. The given tree [4,2,6,1,3,5,7] is represented by the following diagram: 4
/ \
2 6
/ \ / \
1 3 5 7 while the diagrams for the outputs are: 4
/ \
3 6 and 2
/ \ /
5 7 1

思路

递归

Code

class Solution {
public:
vector<TreeNode*> splitBST(TreeNode* root, int V) {
if (!root) {
vector<TreeNode*> ret = {NULL, NULL};
return ret;
}
if (root->val==V) {
vector<TreeNode*> ret = {root, root->right};
root->right = NULL;
return ret;
}
vector<TreeNode*> l = splitBST(root->left, V),
r = splitBST(root->right, V);
if (root->val < V) {
root->right = r[0];
vector<TreeNode*> ret = {root, r[1]};
return ret;
}
else {
root->left = l[1];
vector<TreeNode*> ret = {l[0], root};
return ret;
}
}
};

C. Swap Adjacent in LR String

Description

In a string composed of 'L', 'R', and 'X' characters, like "RXXLRXRXL", a move consists of either replacing one occurrence of "XL" with "LX", or replacing one occurrence of "RX" with "XR". Given the starting string start and the ending string end, return True if and only if there exists a sequence of moves to transform one string to the other.

Example:

Input: start = "RXXLRXRXL", end = "XRLXXRRLX"
Output: True
Explanation:
We can transform start to end following these steps:
RXXLRXRXL ->
XRXLRXRXL ->
XRLXRXRXL ->
XRLXXRRXL ->
XRLXXRRLX

思路

由规则,\(L\)只能一路向左移动,\(R\)只能一路向右移动。

所以,前后所有\(L\)与\(R\)的相对位置关系不变,且\(s2\)中\(L\)的位置只能在\(s1\)中对应的\(L\)的位置的左边,\(s2\)中\(R\)的位置只能在\(s1\)中对应的\(R\)的位置的右边。

Code

class Solution {
public:
struct node {
char c; int p;
};
bool canTransform(string start, string end) {
int len = start.size();
if (len != end.size()) return false;
vector<node> v1, v2;
for (int i = 0; i < len; ++i) {
if (start[i] != 'X') {
v1.push_back({start[i], i});
}
}
for (int i = 0; i < len; ++i) {
if (end[i] != 'X') {
v2.push_back({end[i], i});
}
}
int n = v1.size();
if (n != v2.size()) return false;
for (int i = 0; i < n; ++i) {
if (v1[i].c != v2[i].c) return false;
if (v1[i].c=='L') { if (v1[i].p < v2[i].p) return false; }
else { if (v1[i].p > v2[i].p) return false; }
}
return true;
}
};

D. Swim in Rising Water

Description

On an N x N grid, each square grid[i][j] represents the elevation at that point (i,j).

Now rain starts to fall. At time t, the depth of the water everywhere is t. You can swim from a square to another 4-directionally adjacent square if and only if the total elevation of both squares is at most t. You can swim infinite distance in zero time. Of course, you must stay within the boundaries of the grid during your swim.

You start at the top left square (0, 0). What is the least time until you can reach the bottom right square (N-1, N-1)?

Example 1:

Input: [[0,2],[1,3]]
Output: 3
Explanation:
At time 0, you are in grid location (0, 0).
You cannot go anywhere else because 4-directionally adjacent neighbors have a higher elevation than t = 0. You cannot reach point (1, 1) until time 3.
When the depth of water is 3, we can swim anywhere inside the grid.
Example 2: Input: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]
Output: 16
Explanation:
0 1 2 3 4
24 23 22 21 5
12 13 14 15 16
11 17 18 19 20
10 9 8 7 6 The final route is marked in bold.
We need to wait until time 16 so that (0, 0) and (4, 4) are connected.

思路

题意即 找一条(0, 0)到(n-1,n-1)的路径,上面的最大值最小

二分 最大值,然后判断连通性,用 记忆化搜索 即可。

Code

class Solution {
private:
bool vis[55][55], flag[55][55], temp[55][55];
bool can(int x, int y, int n, vector<vector<int>>& mp) {
if (vis[x][y]) return flag[x][y];
vis[x][y] = true;
if (!temp[x][y]) return flag[x][y] = false;
if ((x-1>=0&&can(x-1,y,n,mp)) || (x+1<n&&can(x+1,y,n,mp))
|| (y-1>=0&&can(x,y-1,n,mp)) || (y+1<n&&can(x,y+1,n,mp))) return flag[x][y] = true;
else return flag[x][y] = false;
}
bool ok(vector<vector<int>>& mp, int n, int x) {
memset(vis, 0, sizeof vis);
memset(flag, 0, sizeof flag);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (mp[i][j] > x) temp[i][j] = 0;
else temp[i][j] = 1;
}
}
if (mp[0][0] <= x) {
flag[0][0] = vis[0][0] = 1;
bool hh = can(n-1, n-1, n, mp);
return hh;
}
else return false;
}
public:
int swimInWater(vector<vector<int>>& grid) {
int n = grid.size(), minn = INT_MAX, maxx = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
minn = min(minn, grid[i][j]), maxx = max(maxx, grid[i][j]);
}
}
int l = minn, r = maxx;
while (l < r) {
int mid = l+r >> 1;
if (ok(grid, n, mid)) r = mid;
else l = mid+1;
}
return l;
}
};

LeetCode Weekly Contest 70 A B C D的更多相关文章

  1. LeetCode Weekly Contest 8

    LeetCode Weekly Contest 8 415. Add Strings User Accepted: 765 User Tried: 822 Total Accepted: 789 To ...

  2. leetcode weekly contest 43

    leetcode weekly contest 43 leetcode649. Dota2 Senate leetcode649.Dota2 Senate 思路: 模拟规则round by round ...

  3. LeetCode Weekly Contest 23

    LeetCode Weekly Contest 23 1. Reverse String II Given a string and an integer k, you need to reverse ...

  4. Leetcode Weekly Contest 86

    Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...

  5. LeetCode Weekly Contest

    链接:https://leetcode.com/contest/leetcode-weekly-contest-33/ A.Longest Harmonious Subsequence 思路:hash ...

  6. 【LeetCode Weekly Contest 26 Q4】Split Array with Equal Sum

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/split-array-with-equal-sum/ ...

  7. 【LeetCode Weekly Contest 26 Q3】Friend Circles

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/friend-circles/ [题意] 告诉你任意两个 ...

  8. 【LeetCode Weekly Contest 26 Q2】Longest Uncommon Subsequence II

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...

  9. 【LeetCode Weekly Contest 26 Q1】Longest Uncommon Subsequence I

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...

随机推荐

  1. python之质数

    质数(prime number)又称素数,有无限个 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 示例: num=[]; i=2 for i in range(2,100): j= ...

  2. composer 自动加载源码解析

    一直在用 composer,最近想看一下具体的原理是什么,就仔细阅读了一下源码,一下是个人理解.在看该文章前最好了解一下 PSR-4 自动加载规范 引入类自动加载文件 # 加载类自动加载文件 requ ...

  3. ubuntu crontab设置定时任务

    ubuntu 设置定时任务   crontab -l  #查看详情crontab -e #设置定时任务 * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用* ...

  4. Python知识点入门笔记——基本控制流程

    复合赋值语句 在Python中,可以使用一次赋值符号,给多个变量同时赋值:                  划重点:age_1,age_2 = age_2,age_1这种操作是Python独有的 i ...

  5. day 63 Django基础九之中间件

    Django基础九之中间件   本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学 ...

  6. django_mysql_配置

    配置 1. 安装Pymysql pip install PyMySQL 然后在项目同名_init__添加 from pymysql import install_as_MySQLdb install_ ...

  7. mem_init()

    原本由bootmem管理的内存在mem_init函数中交由伙伴系统管理. 1.free_unused_memmap_node 相邻的membank间可能存在空洞,但在bootmem阶段这些空洞页也分配 ...

  8. C、C++混合调用——博客收藏

    C与C++接口相互调用:https://www.cnblogs.com/feige1314/p/7890982.html C.C++混合调用:https://www.cnblogs.com/xuany ...

  9. 问题 B: 分组统计

    分组统计 问题 B: 分组统计时间限制: 1 Sec 内存限制: 32 MB 提交: 416 解决: 107 [提交][状态][讨论版][命题人:外部导入] 题目描述 先输入一组数,然后输入其分组,按 ...

  10. python双向链表的疑问(Question)

    Table of Contents 1. 问题 问题 在看 collections.OrderedDict 的源码时,对于它如何构造有序的结构这一部分不是很理解,代码如下: class Ordered ...