文章目录

  • 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 解题报告相关推荐

  1. [LeetCode] Multiply Strings 解题报告

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  2. LeetCode: Sort List 解题报告

    Sort List Sort a linked list in O(n log n) time using constant space complexity. 使用Merge Sort, 空间复杂度 ...

  3. [LeetCode]Distinct Subsequences,解题报告

    题目 Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequen ...

  4. LeetCode: Maximum Subarray 解题报告

    Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...

  5. LeetCode: Add Binary 解题报告

    Add Binary Given two binary strings, return their sum (also a binary string). For example, a = " ...

  6. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  7. LeetCode第45场双周赛-解题报告

    LeetCode第45场双周赛-解题报告 A. 唯一元素的和 原题链接 https://leetcode-cn.com/problems/sum-of-unique-elements/ 解题思路 因为 ...

  8. [LeetCode解题报告] LCP 48. 无限棋局

    [LeetCode解题报告] LCP 48. 无限棋局 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. ...

  9. LeetCode 167.Two Sum II 解题报告

    LeetCode 167.Two Sum II 解题报告 题目描述 Given an array of integers that is already sorted in ascending ord ...

最新文章

  1. 理解 ajax、fetch和axios
  2. ViSP中识别AprilTag的C++实例代码解释
  3. 【干货】搭建社区运营团队的一些经验和“血的教训”
  4. 【LeetCode刷题记】鹅厂秋招题集(2)
  5. 启明云端分享| 乐鑫刚发布的 ESP32-C2与今年五月份量产的ESP32-C3有哪些不同呢?作为两颗升级替代ESP8286的芯片,我们在应用时怎么去选择呢
  6. 新手入门Web前端要掌握的4项基础技能
  7. 混合文件下分离xml文件和jpg文件
  8. (计算机组成原理)第七章输入和输出系统-第二节1:外部设备之输入和输出设备(键盘鼠标、显示器和打印机)
  9. 多线程编程学习总结(转载)
  10. bootstrap时间格式化
  11. PostgreSQL\GPDB 多维数据透视典型案例分享
  12. 360浏览器清除缓存_放飞浏览器的反应速度
  13. Spring源码下载编译全过程!超详细的步骤!!!
  14. mysql是bsd协议吗_五种开源协议(GPL,LGPL,BSD,MIT,Apache)介绍
  15. 使用阿里云对象存储OSS搭建网盘
  16. 电影图标-黑客帝国(The Matrix)
  17. C++实现复数矩阵求逆 matlab inv
  18. html中calc属性什么意思,深入理解CSS calc属性
  19. hive整合HBase:HBase table xsg:test05 doesn't exist while the table is declared as an external table
  20. 但总觉得明白了一点点什么

热门文章

  1. vue打包时报错Ineffective mark-compacts near heap limit Allocation failed-JavaScript heap out of memory
  2. 在cdh平台上创建新用户
  3. uniapp使用高德地图定位
  4. 使用QML自绘页面导航条
  5. 详细介绍 Node.js
  6. Echarts中国地图背景颜色渐变
  7. 企业邮箱对比介绍,国内各大企业邮箱介个费用对比
  8. 江苏师范大学计算机全国排名,2019中国大学排行榜江苏师范大学排名126位
  9. python soup.find_初识python 之 爬虫:BeautifulSoup 的 find、find_all、select 方法
  10. VsCode安装和配置C++环境详细全流程