代码随想录算法训练营第十九天

LeetCode题目:

  • 77. 组合
  • 216. 组合总和 III
  • 17. 电话号码的字母组合
  • 2537. 统计好子数组的数目(每日一题)
  • 516. 最长回文子序列
  • 1039. 多边形三角剖分的最低得分
  • 543. 二叉树的直径
  • 124. 二叉树中的最大路径和
  • 2246. 相邻字符不同的最长路径

其他:

今日总结
往期打卡


77. 组合

跳转: 77. 组合

学习: 代码随想录公开讲解

问题:

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

思路:

递归传入剩余需选个数,归零终止.
剪枝: 用需选个数可以求出遍历范围,及至少给以后的选择留出足够的数
因为使用dfs,一次只需要存储一条路径即可

使用迭代法需要储存大量的子状态. 而且因为空间需要提前预定义,所以不方便做剪枝.
其上下层之间的操作相对独立,没有明显练习,所以无法做递推.

复杂度:

  • 时间复杂度: O ( k 2 ) O(k^2) O(k2)
  • 空间复杂度: O ( k ) O(k) O(k)

代码:

class Solution {int k;List<List<Integer>> ans;private final List<Integer> path = new ArrayList<>();void dfs(int n){int d = k-path.size();if(d==0) {ans.add(new ArrayList<>(path));return;}for(int j=n;j>=d;j--){path.add(j);dfs(j-1);path.remove(path.size()-1);}}public List<List<Integer>> combine(int n, int k) {this.k = k;ans = new ArrayList<>();dfs(n);return ans;}
}

216. 组合总和 III

跳转: 216. 组合总和 III

学习: 代码随想录公开讲解

问题:

找出所有相加之和为 nk 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

思路:

递归的终止条件改为两个,和大于n或还需选择数为0

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution {List<List<Integer>> ans ;List<Integer> path = new ArrayList<>();int sum = 0;int n;void dfs(int k,int start){if(sum>n) return;if(k==0){if(sum==n) ans.add(new ArrayList<>(path));return;}for(int i=start;i<=9;i++){sum+=i;path.add(i);dfs(k-1,i+1);sum-=i;path.remove(path.size()-1);}}public List<List<Integer>> combinationSum3(int k, int n) {ans = new ArrayList<>();this.n = n;dfs(k,1);return ans;}
}

17. 电话号码的字母组合

跳转: 17. 电话号码的字母组合

学习: 代码随想录公开讲解

问题:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

思路:

终止条件为按过全部电话键,因为这题求的是全排列,所以没法做剪枝操作

复杂度:

  • 时间复杂度: O ( 3 n ) O(3^n) O(3n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution {private static final String[] MAPPING = new String[]{ "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};List<String> ans;private char[] path;void backtracking(char[] list,int index){if(index==list.length){ans.add(new String(path));return;}int k = list[index]-50;for(char c:MAPPING[k].toCharArray()){path[index] = c;backtracking(list,index+1);}}public List<String> letterCombinations(String digits) {int n = digits.length();ans = new ArrayList<>();if(n==0) return ans;path = new char[n];backtracking(digits.toCharArray(),0);return ans;}
}

2537. 统计好子数组的数目(每日一题)

跳转: 2537. 统计好子数组的数目

学习: 灵茶山艾府题解

问题:

给你一个整数数组 nums 和一个整数 k ,请你返回 nums 子数组的数目。

一个子数组 arr 如果有 至少 k 对下标 (i, j) 满足 i < jarr[i] == arr[j] ,那么称它是一个 子数组。

子数组 是原数组中一段连续 非空 的元素序列。

思路:

这题可以使用滑动窗口加哈希表,每次收缩到刚好满足条件,计算时加上被抛弃的前缀数
求的是选出两个相同元素,对于单个元素来讲,刚好是0,1,3,6,每次加一个n-1到n

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution {public long countGood(int[] nums, int k) {int n = nums.length;Map<Integer,Integer> map = new HashMap<>();int sum = 0;long ans = 0;for(int i=0,pre = 0;i<n;i++){sum+=map.getOrDefault(nums[i],0);map.put(nums[i],map.getOrDefault(nums[i],0)+1);while(sum>=k){map.put(nums[pre],map.get(nums[pre])-1);sum-=map.get(nums[pre]);pre++;// System.out.println(pre);}ans=ans+pre;}return ans;}
}

516. 最长回文子序列

跳转: 516. 最长回文子序列

学习: 灵茶山艾府题解

问题:

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

思路:

题目中不要求连续,但给出了回文序列的条件.
满足条件就都选,不满足条件留使子串最大的一边
dp数组值的含义是当前区间内能选出的最大的回文子串长度

复杂度:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n ) O(n) O(n)

代码(递推空间优化):

class Solution {public int longestPalindromeSubseq(String s) {int n = s.length();int[] f = new int[n];for(int i=n-1;i>=0;i--){f[i] = 1;int pre = 0;for(int j=i+1;j<n;j++){int tmp = f[j];if(s.charAt(i)==s.charAt(j)) f[j] = pre+2;else f[j] = Math.max(f[j],f[j-1]);pre = tmp;}}return f[n-1];}
}

复杂度:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

代码(递归+记忆化搜索):

class Solution {int[][] cache;int dfs(String s,int l,int r){if(l==r) return 1;if(l>r) return 0;if(cache[l][r]!=-1) return cache[l][r];if(s.charAt(l)==s.charAt(r)) return cache[l][r] = dfs(s,l+1,r-1)+2;else return cache[l][r] = Math.max(dfs(s,l+1,r),dfs(s,l,r-1));}public int longestPalindromeSubseq(String s) {cache = new int[s.length()][s.length()];for(int[] i:cache){Arrays.fill(i,-1);}return dfs(s,0,s.length()-1);}
}

代码(递推):

class Solution {public int longestPalindromeSubseq(String s) {int n = s.length();int[][] f = new int[n][n];for(int i=n-1;i>=0;i--){for(int j=0;j<n;j++){if(i==j) f[i][j] = 1;else if(i>j) continue;else {if(s.charAt(i)==s.charAt(j)) f[i][j] = f[i+1][j-1]+2;else f[i][j] = Math.max(f[i+1][j],f[i][j-1]);}}            }return f[0][n-1];}
}

1039. 多边形三角剖分的最低得分

跳转: 1039. 多边形三角剖分的最低得分

学习: 灵茶山艾府题解

问题:

你有一个凸的 n 边形,其每个顶点都有一个整数值。给定一个整数数组 values ,其中 values[i] 是第 i 个顶点的值(即 顺时针顺序 )。

假设将多边形 剖分n - 2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 n - 2 个三角形的值之和。

返回 多边形进行三角剖分后可以得到的最低分

思路:

遍历区间找所有可能的三角形,每次划分继续二分区间遍历

复杂度:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

代码(递推):

class Solution {public int minScoreTriangulation(int[] values) {int n = values.length;int[][] f = new int[n][n];for(int i = n-3;i>=0;i--){for(int j=i+2;j<n;j++){f[i][j] = Integer.MAX_VALUE;for(int k=i+1;k<j;k++){f[i][j] = Math.min(f[i][j],f[i][k]+f[k][j]+values[i]*values[k]*values[j]);}}}return f[0][n-1];}
}

代码(递归):

class Solution {int[] v;int[][] cache;int dfs(int l,int r){if(r<=l+1) return 0;if(cache[l][r]!=0) return cache[l][r];int min = Integer.MAX_VALUE>>1;for(int i=l+1;i<r;i++){int tmp = dfs(l,i)+dfs(i,r)+v[i]*v[l]*v[r];if(tmp<min) min = tmp;}return cache[l][r]=min;}public int minScoreTriangulation(int[] values) {int n = values.length;cache = new int[n][n];v = values;return dfs(0,n-1);}
}

543. 二叉树的直径

跳转: 543. 二叉树的直径

学习: 灵茶山艾府题解

问题:

给你一棵二叉树的根节点,返回该树的 直径

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root

两节点之间路径的 长度 由它们之间边数表示。

思路:

当前最大是左最大+右最大+1
然后返回左右最大的一条数量

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution {int ans=0;int dfs(TreeNode root){if(root==null) return 0;int l = dfs(root.left);int r = dfs(root.right);ans = Math.max(ans,l+r);return Math.max(l,r)+1;}public int diameterOfBinaryTree(TreeNode root) {dfs(root);return ans;}
}

124. 二叉树中的最大路径和

跳转: 124. 二叉树中的最大路径和

学习: 灵茶山艾府题解

问题:

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和

思路:

dfs,上一题求数量改求和了
不过需要注意,子树如果为负不应该选,所以可以直接返回时和0比较一下

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution {int ans=Integer.MIN_VALUE;int dfs(TreeNode root){if(root==null) return 0;int l = dfs(root.left);int r = dfs(root.right);ans = Math.max(ans,l+r+root.val);return Math.max(Math.max(l,r)+root.val,0);}public int maxPathSum(TreeNode root) {dfs(root);return ans;}
}

2246. 相邻字符不同的最长路径

跳转: 2246. 相邻字符不同的最长路径

学习: 灵茶山艾府题解

问题:

给你一棵 (即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0n - 1n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树,其中 parent[i] 是节点 i 的父节点,由于节点 0 是根节点,所以 parent[0] == -1

另给你一个字符串 s ,长度也是 n ,其中 s[i] 表示分配给节点 i 的字符。

请你找出路径上任意一对相邻节点都没有分配到相同字符的 最长路径 ,并返回该路径的长度。

思路:

父节点的父节点一定比子节点的父节点小吗? 显然这题不是这样的,我们无法排出一个合理的顺序.
所以这题不能使用倒序遍历,只能自顶向下遍历.

题目中给的是父节点数组,所以需要构造和子节点的哈希.

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution {private List<Integer>[] g;private char[] s;private int ans;int dfs(int x){int maxLen = 0;for(int y:g[x]){int len = dfs(y)+1;if(s[y]!=s[x]){ans = Math.max(ans,maxLen+len);maxLen = Math.max(maxLen,len);}}return maxLen;}public int longestPath(int[] parent, String s) {int n = parent.length;this.s = s.toCharArray();g = new ArrayList[n];Arrays.setAll(g, e -> new ArrayList<>());for(int i=1;i<n;i++){g[parent[i]].add(i);}dfs(0);return ans+1;}
}

总结

练习了组合回溯以及区间DP,树性DP

回溯算法模板框架:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

往期打卡

代码随想录算法训练营第十八天

代码随想录算法训练营第十七天

代码随想录算法训练营周末三

代码随想录算法训练营第十六天

代码随想录算法训练营第十五天

代码随想录算法训练营第十四天

代码随想录算法训练营第十三天

代码随想录算法训练营第十二天

代码随想录算法训练营第十一天

代码随想录算法训练营周末二

代码随想录算法训练营第十天

代码随想录算法训练营第九天

代码随想录算法训练营第八天

代码随想录算法训练营第七天

代码随想录算法训练营第六天

代码随想录算法训练营第五天

代码随想录算法训练营周末一

代码随想录算法训练营第四天

代码随想录算法训练营第三天

代码随想录算法训练营第二天

代码随想录算法训练营第一天

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

存算分离看场景

计算机行业是唯一一个比时装行业概念更多的行业。概念频出&#xff0c;最慢的话半年一定出一个&#xff0c;短的话半个月就能看到新的名词和技术甚至是概念。 存算分离的概念 我第一次听到存算分离时候还是从Hadoop上听到的。然后就去问什么是存算分离。听了讲解以后&#xf…

MCP协议,.Net 使用示例

服务器端示例 基础服务器 以下是一个基础的 MCP 服务器示例&#xff0c;它使用标准输入输出&#xff08;stdio&#xff09;作为传输方式&#xff0c;并实现了一个简单的回显工具&#xff1a; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.H…

智能语音处理+1.5使用PocketSphinxshinx实现语音转文本(100%教会)

欢迎来到智能语音处理系列的最后一篇文章&#xff0c;到这里,基本上语音处理是没问题了. 第一篇:智能语音处理1.1下载需要的库(100%实现)-CSDN博客 第二篇:智能语音识别1.2用SAPI实现文本转语音(100%教会)-CSDN博客 第三篇:智能语音处理1.3用SpeechLib实现文本转语音(100%教会)…

Kubernetes 节点摘除指南

目录 一、安全摘除节点的标准流程 1. 确认节点名称及状态 2. 标记节点为不可调度 3. 排空&#xff08;Drain&#xff09;节点 4. 删除节点 二、验证节点是否成功摘除 1. 检查节点列表 2. 检查节点详细信息 3. 验证 Pod 状态 三、彻底清理节点&#xff08;可选&#xf…

信息安全管理与评估2021年国赛正式卷答案截图以及十套国赛卷

2021年全国职业院校技能大赛高职组 “信息安全管理与评估”赛项 任务书1 赛项时间 共计X小时。 赛项信息 赛项内容 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 任务1 网络平台搭建 任务2 网络安全设备配置与防护 第二…

3D语义地图中的全局路径规划!iPPD:基于3D语义地图的指令引导路径规划视觉语言导航

作者&#xff1a; Zehao Wang, Mingxiao Li, Minye Wu, Marie-Francine Moens, Tinne Tuytelaars 单位&#xff1a;鲁汶大学电气工程系&#xff0c;鲁汶大学计算机科学系 论文标题&#xff1a; Instruction-guided path planning with 3D semantic maps for vision-language …

《AI大模型应知应会100篇》第20篇:大模型伦理准则与监管趋势

第20篇&#xff1a;大模型伦理准则与监管趋势 摘要 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;尤其是大模型&#xff08;如GPT、PaLM等&#xff09;在自然语言处理、图像生成等领域的广泛应用&#xff0c;AI伦理问题和监管挑战日益凸显。本文将梳理当…

【Ai】dify:Linux环境安装 dify 详细步骤

一、什么是dify Dify 是一个 开源的大语言模型(LLM)应用开发平台,旨在帮助开发者快速构建基于 AI 的应用程序,例如智能对话助手、知识库问答、内容生成工具等。它提供了可视化的流程编排、模型集成、数据管理等功能,降低了开发门槛,支持快速迭代和部署。 核心功能与特点…

CentOS 操作系统下搭建 tsung性能测试环境

写在前面 为何这么安装,实际就是这么做的,这是经过好几次实践得出的经验总结。 这为了让大家更清楚的知道怎么安装 tsung性能测试环境,按步照搬的安装即可。 步骤 1、 下载软件安装包 CentOS-6.0-x86_64-bin-DVD1.iso jdk-6u4-linux-x64-rpm.bin erlang: otp_src_1…

Vulkanised

Vulkanised 1. About VulkanisedReferences The Premier Vulkan Developer Conference premier /ˈpremiə(r)/ n. 总理&#xff1b;(尤用于报章等) 首相&#xff1b;(加拿大的) 省总理&#xff1b;地区总理 adj. 第一的&#xff1b;首要的&#xff1b;最著名的&#xff1b;最…

C++之 动态数组

一、新建一个动态数组 数组名和下标操作符[]的组合可以被替换成一个指向该数组的基地址的指针和对应的指针运算&#xff1a; int a[20]; int *x a; 指针变量 x 指向数组 a 的地址&#xff0c; a[0] 和 *x 都代表数组的第一个元素。 于是&#xff0c;根据指针运算原则&…

ubuntu1804服务器开启ftp,局域网共享特定文件给匿名用户

要在 Ubuntu 18.04 上设置一个 FTP 服务器&#xff0c;满足以下要求&#xff1a; 允许匿名登录&#xff08;无需账号密码&#xff09;。指定分享特定目录下的文件。只允许只读下载。 可以使用 vsftpd&#xff08;Very Secure FTP Daemon&#xff09;来实现。以下是详细步骤&a…

mcp和API区别

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;与传统API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;在技术架构、集成方式和应用场景等方面存在显著差异&#xff0c;以下是主要区别的总结&#x…

高版本Android (AIDL HAL) 使用HIDL方法

目录 修改步骤和编译方法 注意事项 Android 11 引入了使用 AIDL 实现 HAL 的功能。 后续Android新版本,HAL默认切到了使用AIDL. 因此当导入旧HIDL实现方式时,需要做一些修改。 1.将HAL HIDL模块拷贝到相应目录,进行编译 source build/envsetup.sh lunch xxx mmm 模块路径 1.…

基于redis 实现我的收藏功能优化详细设计方案

基于redis 实现我的收藏功能优化详细设计方案 一、架构设计 +---------------------+ +---------------------+ | 客户端请求 | | 数据存储层 | | (收藏列表查询) | | (Redis Cluster) | +-------------------…

学习笔记 - Swfit 6.1 - 语法概览

获取版本号 swift -versionHello world print("Hello, world!")末尾不需要分号 值 常量(let),变量(var) var myVariable 42 myVariable 50 let myConstant 42可以显式声明变量类型,若没有则隐式推断,类似下面的Double let implicitInteger 70 let implicit…

确保连接器后壳高性能互连的完整性

本文探讨了现代后壳技术如何促进高性能互连的电气和机械完整性&#xff0c;以及在规范阶段需要考虑的一些关键因素。 当今的航空航天、国防和医疗应用要求连接器能够提供高速和紧凑的互连&#xff0c;能够承受振动和冲击&#xff0c;并保持对电磁和射频干扰 &#xff08;EMI/R…

第IV部分有效应用程序的设计模式

第IV部分有效应用程序的设计模式 第IV部分有效应用程序的设计模式第23章:应用程序用户界面的架构设计23.1设计考量23.2示例1:用于非分布式有界上下文的一个基于HTMLAF的、服务器端的UI23.3示例2:用于分布式有界上下文的一个基于数据API的客户端UI23.4要点第24章:CQRS:一种…

学习笔记十四——一文看懂 Rust 迭代器

&#x1f300; 一文看懂 Rust 迭代器 &#x1f4da; 目录导航 什么是迭代器&#xff1f;为什么 Rust 到处都在用它&#xff1f;Rust 迭代器的底层逻辑是什么&#xff1f;适配器 vs 消费者&#xff1a;谁是主角&#xff1f;常见适配器&#xff1a;加工数据的全能工厂常见消费者…

QR轻量二维码生成系统PHP源码

源码介绍 基于PHP编写的二维码在线生成系统。只需点击几下就可以生成您的个人二维码&#xff01;上传您的徽标&#xff0c;选择自定义颜色&#xff0c;生成多种类型。选择一个图案并下载最终的qrcode。可用格式&#xff1a;.png&#xff0c;.svg 效果预览 源码获取 QR轻量二…