Leetcode Weekly 188 解题报告
文章目录
- Leetcode 1441. 用栈操作构建数组
- Leetcode 1442. 形成两个异或相等数组的三元组数目
- Leetcode 1443. 收集树上所有苹果的最少时间
- Leetcode 1444. 切披萨的方案数
Leetcode 1441. 用栈操作构建数组
题目链接
注意 “Push” / “Pop” 的大写即可。
class Solution {public List<String> buildArray(int[] target, int n) {List<String> ret = new ArrayList<>();int i = 1;for (int val : target) {while (val != i) {ret.add("Push");ret.add("Pop");i++;}ret.add("Push");i++;}return ret;}
}
Time:O(n)Time: O(n)Time:O(n)
Space:O(n)Space:O(n)Space:O(n)
\newline
\newline
Leetcode 1442. 形成两个异或相等数组的三元组数目
题目链接
根据题意,
a=arr[i]a = arr[i]a=arr[i] ^ arr[i+1]arr[i + 1]arr[i+1] ^ ......... ^ arr[j−1]arr[j - 1]arr[j−1]
b=arr[j]b = arr[j]b=arr[j] ^ arr[j+1]arr[j + 1]arr[j+1] ^ ......... ^ arr[k]arr[k]arr[k]
那么 aaa ^ b=0b = 0b=0。
所以如果我们计算数组的 XORXORXOR 前缀和,那么如果 sum[i]==sum[k]sum[i] == sum[k]sum[i]==sum[k],就有
arr[i+1]arr[i + 1]arr[i+1] ^ arr[i+2]arr[i + 2]arr[i+2] ^ ......... ^ arr[k]==0arr[k] == 0arr[k]==0,
那么选取 j=i+2,i+3,...kj = i + 2, i + 3, ...kj=i+2,i+3,...k 就能获得 k−i−1k - i - 1k−i−1 个不同的三元组。
这个可以用一个 HashMapHashMapHashMap 实现。
class Solution {public int countTriplets(int[] arr) {int sum = 0;Map<Integer, List<Integer>> map = new HashMap<>() {{put(0, new ArrayList<Integer>() {{add(-1);}});}};int ans = 0;for (int i = 0; i < arr.length; ++i) {sum ^= arr[i];if (map.containsKey(sum)) {for (int idx : map.get(sum)) {ans += i - idx - 1;}}List<Integer> list = map.computeIfAbsent(sum, k -> new ArrayList<Integer>());list.add(i);}return ans;}
}
Time:O(n2)Time: O(n^{2}_{})Time:O(n2)
Space:O(n)Space:O(n)Space:O(n)
\newline
\newline
Leetcode 1443. 收集树上所有苹果的最少时间
题目链接
做两次遍历,第一次计算一个节点及其所有的子孙节点是否含有苹果。
第二次 DFS 计算时间,如果一个孩子节点及其子孙有苹果就继续递归走下去。
class Solution {private LinkedList<Integer>[] g;private boolean[] has;List<Boolean> hasApple;public int minTime(int n, int[][] edges, List<Boolean> hasApple) {g = new LinkedList[n];for (int i = 0; i < n; ++i) {g[i] = new LinkedList<Integer>();}this.hasApple = hasApple;has = new boolean[n];for (int[] edge : edges) {g[edge[0]].add(edge[1]);g[edge[1]].add(edge[0]);}dfs1(0, -1);return dfs2(0, -1);}// Calculate whether a node or its children have applesprivate void dfs1(int u, int fa) {if (hasApple.get(u)) {has[u] = true;}for (int v : g[u]) {if (v == fa) {continue;}dfs1(v, u);has[u] |= has[v];}}private int dfs2(int u, int fa) {int ans = 0;for (int v : g[u]) {if (v != fa && has[v]) {ans++;ans += dfs2(v, u);ans++;}}return ans;}
}
Time:O(V+E)Time: O(V + E)Time:O(V+E)
Space:O(V)Space:O(V)Space:O(V)
\newline
\newline
Leetcode 1444. 切披萨的方案数
题目链接
这一题看样子是可以往动态规划方面考虑,定义一个状态 dp[i][j][k]dp[i][j][k]dp[i][j][k] 是从 (i,j)(i, j)(i,j) 那一格到右下角的这一块披萨,切 kkk 刀共有多少种切法。那么状态转移方程就是:
dp[i][j][k]=∑i<ni<mdp[ni][j][k−1]+∑j<nj<ndp[i][nj][k−1]dp[i][j][k] = \sum_{i < ni < m} dp[ni][j][k - 1] + \sum_{j < nj < n} dp[i][nj][k - 1]dp[i][j][k]=i<ni<m∑dp[ni][j][k−1]+j<nj<n∑dp[i][nj][k−1]
ninini 表示从 ninini 这一行上面开始横切, njnjnj 表示从 njnjnj 这一列左边竖切。
这里需要注意,我们仍然需要保证从 (i,j)(i, j)(i,j) 到 (ni,j)(ni, j)(ni,j) 这上半块里面至少需要有一个苹果。对于 (i,j)(i, j)(i,j) 到 (i,nj)(i, nj)(i,nj) 这左半块也是需要有至少一个苹果。 我们可以记录一个用 sum[i][j]sum[i][j]sum[i][j] 记录 (i,j)(i, j)(i,j) 到 (m−1,n−1)(m - 1, n - 1)(m−1,n−1) 这块区域共有多少个苹果。那么最终的状态转移方程就是:
\newline
dp[i][j][k]=∑i<ni<m,sum[i][j]>sum[ni][j]dp[ni][j][k−1]+∑j<nj<n,sum[i][j]>sum[i][nj]dp[i][nj][k−1]dp[i][j][k] = \sum_{i < ni < m, sum[i][j] > sum[ni][j]} dp[ni][j][k - 1] + \sum_{j < nj < n, sum[i][j] > sum[i][nj]} dp[i][nj][k - 1]dp[i][j][k]=i<ni<m,sum[i][j]>sum[ni][j]∑dp[ni][j][k−1]+j<nj<n,sum[i][j]>sum[i][nj]∑dp[i][nj][k−1]
\newline
初始状态 dp[i][j][0]=sum[i][j]>0?1:0dp[i][j][0] = sum[i][j] > 0\space?\space1 : 0dp[i][j][0]=sum[i][j]>0 ? 1:0 当没有切的时候,如果这一块有苹果说明是一种切法。
因为第三维只和 k−1k - 1k−1 有关,所以可以简化为二维滚动数组。
\newline
\newline
class Solution {private static final int MOD = 1000000007;public int ways(String[] pizza, int k) {int m = pizza.length;int n = pizza[0].length();int[][] prev = new int[m][n];int[][] sum = new int[m][n];for (int i = m - 1; i >= 0; --i) {for (int j = n - 1; j >= 0; --j) {int A = i < m - 1 ? sum[i + 1][j] : 0;int B = j < n - 1 ? sum[i][j + 1] : 0;int C = i < m - 1 && j < n - 1 ? sum[i + 1][j + 1] : 0;sum[i][j] = pizza[i].charAt(j) == 'A' ? 1 : 0;sum[i][j] += A + B - C;}}for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {prev[i][j] = sum[i][j] > 0 ? 1 : 0;}}for (int t = 1; t < k; ++t) {int[][] next = new int[m][n];for (int i = m - 1; i >= 0; --i) {for (int j = n - 1; j >= 0; --j) {for (int ni = i + 1; ni < m; ++ni) {if (sum[i][j] > sum[ni][j]) {next[i][j] = (next[i][j] + prev[ni][j]) % MOD;}}for (int nj = j + 1; nj < n; ++nj) {if (sum[i][j] > sum[i][nj]) {next[i][j] = (next[i][j] + prev[i][nj]) % MOD;}}}}prev = next;}return prev[0][0];}
}
Time:O(kmn(m+n))Time: O(kmn(m + n))Time:O(kmn(m+n))
Space:O(mn)Space:O(mn)Space:O(mn)
\newline
\newline
下面是记忆化搜索的写法
class Solution {private static final int MOD = 1000000007;private int[][] sum;private int[][][] f;private int m;private int n;public int ways(String[] pizza, int k) {m = pizza.length;n = pizza[0].length();sum = new int[m][n];for (int i = m - 1; i >= 0; --i) {for (int j = n - 1; j >= 0; --j) {sum[i][j] = pizza[i].charAt(j) == 'A' ? 1 : 0;int A = i < m - 1 ? sum[i + 1][j] : 0;int B = j < n - 1 ? sum[i][j + 1] : 0;int C = i < m - 1 && j < n - 1 ? sum[i + 1][j + 1] : 0;sum[i][j] += A + B - C;}}f = new int[m][n][k + 1];for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {Arrays.fill(f[i][j], -1);}}return helper(0, 0, k);}private int helper(int row, int col, int k) {if (f[row][col][k] >= 0) {return f[row][col][k];}if (sum[row][col] < k) {return f[row][col][k] = 0;}if (k == 1) {return f[row][col][k] = 1;}f[row][col][k] = 0;for (int i = row + 1; i < m; ++i) {if (sum[row][col] > sum[i][col]) {f[row][col][k] = (f[row][col][k] + helper(i, col, k - 1)) % MOD;}}for (int j = col + 1; j < n; ++j) {if (sum[row][col] > sum[row][j]) {f[row][col][k] = (f[row][col][k] + helper(row, j, k - 1)) % MOD;}}return f[row][col][k];}
}
Time:O(kmn(m+n))Time: O(kmn(m + n))Time:O(kmn(m+n))
Space:O(mnk)Space:O(mnk)Space:O(mnk)
\newline
\newline
Leetcode Weekly 188 解题报告相关推荐
- [LeetCode] Multiply Strings 解题报告
Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...
- LeetCode: Sort List 解题报告
Sort List Sort a linked list in O(n log n) time using constant space complexity. 使用Merge Sort, 空间复杂度 ...
- [LeetCode]Distinct Subsequences,解题报告
题目 Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequen ...
- LeetCode: Maximum Subarray 解题报告
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- LeetCode: Add Binary 解题报告
Add Binary Given two binary strings, return their sum (also a binary string). For example, a = " ...
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
- LeetCode第45场双周赛-解题报告
LeetCode第45场双周赛-解题报告 A. 唯一元素的和 原题链接 https://leetcode-cn.com/problems/sum-of-unique-elements/ 解题思路 因为 ...
- [LeetCode解题报告] LCP 48. 无限棋局
[LeetCode解题报告] LCP 48. 无限棋局 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. ...
- LeetCode 167.Two Sum II 解题报告
LeetCode 167.Two Sum II 解题报告 题目描述 Given an array of integers that is already sorted in ascending ord ...
最新文章
- 理解 ajax、fetch和axios
- ViSP中识别AprilTag的C++实例代码解释
- 【干货】搭建社区运营团队的一些经验和“血的教训”
- 【LeetCode刷题记】鹅厂秋招题集(2)
- 启明云端分享| 乐鑫刚发布的 ESP32-C2与今年五月份量产的ESP32-C3有哪些不同呢?作为两颗升级替代ESP8286的芯片,我们在应用时怎么去选择呢
- 新手入门Web前端要掌握的4项基础技能
- 混合文件下分离xml文件和jpg文件
- (计算机组成原理)第七章输入和输出系统-第二节1:外部设备之输入和输出设备(键盘鼠标、显示器和打印机)
- 多线程编程学习总结(转载)
- bootstrap时间格式化
- PostgreSQL\GPDB 多维数据透视典型案例分享
- 360浏览器清除缓存_放飞浏览器的反应速度
- Spring源码下载编译全过程!超详细的步骤!!!
- mysql是bsd协议吗_五种开源协议(GPL,LGPL,BSD,MIT,Apache)介绍
- 使用阿里云对象存储OSS搭建网盘
- 电影图标-黑客帝国(The Matrix)
- C++实现复数矩阵求逆 matlab inv
- html中calc属性什么意思,深入理解CSS calc属性
- hive整合HBase:HBase table xsg:test05 doesn't exist while the table is declared as an external table
- 但总觉得明白了一点点什么
热门文章
- vue打包时报错Ineffective mark-compacts near heap limit Allocation failed-JavaScript heap out of memory
- 在cdh平台上创建新用户
- uniapp使用高德地图定位
- 使用QML自绘页面导航条
- 详细介绍 Node.js
- Echarts中国地图背景颜色渐变
- 企业邮箱对比介绍,国内各大企业邮箱介个费用对比
- 江苏师范大学计算机全国排名,2019中国大学排行榜江苏师范大学排名126位
- python soup.find_初识python 之 爬虫:BeautifulSoup 的 find、find_all、select 方法
- VsCode安装和配置C++环境详细全流程