
数据结构与算法
文章平均质量分 63
程序员三木
[优快云全栈领域优秀创作者| 阿里云博客社区专家博主] 作为某云服务提供商的后端开发人员,我将在这里与大家简要分享一些实用的开发小技巧。在我的职业生涯中积累了丰富的经验,希望能通过这个博客与大家交流、学习和成长。
展开
-
[AIGC] 动态规划的类型以及在 LeetCode 上的应用
动态规划是一种解决问题的优秀策略,它适用于涉及优化问题、组合问题及最短路径问题等领域。下面我们来探究几类常见的动态规划问题,并提供相应的 LeetCode 题目以及 Java 代码实现。原创 2024-06-24 22:32:28 · 590 阅读 · 0 评论 -
[leetcode] 2288. 价格减免 M
对于每个表示价格的单词,都在价格的基础上减免 discount% ,并 更新 该单词到句子中。所有更新后的价格应该表示为一个 恰好保留小数点后两位 的数字。句子 是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号 ‘$’。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个 价格。表示价格的单词分别是 “$3”、“$5”、“$6” 和 “$9”。表示价格的单词是 “$1” 和 “$2”。例如 “$100”、“$23” 和 “原创 2024-06-19 08:30:00 · 527 阅读 · 1 评论 -
[AIGC] 深入理解拓扑排序
拓扑排序(Topological Sorting)是针对有向无环图(Directed Acyclic Graph,简称DAG)的一种排序算法。不同于我们常见的排序算法,它的作用是对DAG中的节点进行排序,以使得每一个有向边uv(u,v)uv从uuu到vvv,均有uuu在vvv之前。换句话说,若存在一条从节点uuu到节点vvv的路径,那么排序后uuu必定在vvv之前。原创 2024-06-18 08:30:00 · 1028 阅读 · 0 评论 -
[AIGC] 图论基础入门
图是由点(称为节点或顶点)和线(称为边)组成的。这些点和线可能代表现实生活中的某些对象或实体,边表示这些对象之间的某种关系。基本上,有两种类型的图:无向图:边没有方向。如果存在一条连接节点 A 和节点 B 的边,那么我们可以说 A 是 B 的邻居,反之亦然。eg. A – B有向图:边有方向。如果存在一条从节点 A 指向节点 B 的边,那么我们只能说 B 是 A 的邻居,但不能说 A 是 B 的邻居。注意:在无向图中,边(A,B)和(B,A)是相同的。但在有向图中,A->B和B->A。原创 2024-06-18 08:00:00 · 915 阅读 · 0 评论 -
[AIGC] 详细了解Python中的sorted()函数
函数提供了一种快捷、易用,并且强大的解决方案,使我们能够高效的对各类型的数据进行排序。无论你是Python的新手还是老手,掌握和理解。Python语言为我们提供了许多内置函数,以方便和增强我们在编程过程中的效率和便捷性。不论是在数据处理还是在日常编程中,“排序”都是一个非常常见的需求。函数主要用于对序列进行排序,创建一个这个序列的已排序列表。是非常重要且常用的一个函数,它用于对序列进行排序,并返回一个排序后的列表。函数时,它会返回一个排序后的新列表,原列表不会改变。会使用对象的长度作为排序的标准。原创 2024-06-17 08:30:00 · 555 阅读 · 1 评论 -
[AIGC] Python内置函数:刷题必备
在Python编程和刷题过程中,我们经常会使用到一些内置函数来提升我们的效率。这些内置函数功能强大,使用恰当会大大简化我们的代码。max()sum()min()和sorted()。原创 2024-06-17 08:00:00 · 381 阅读 · 0 评论 -
[AIGC] python遍历以及字符串的切片
通过这篇教程,我们学习了Python的遍历方法和字符串切片,并且我们还看到了它们在实际问题中的运用。希望这对你有所帮助,欢迎于评论区间留下你的思考和问题。图片来源:https://mybios.me/how-to-do-string-slicing-in-python/在实际的编程学习中,不仅要理解和掌握语言的基本要素,还需要看到这些要素如何在实际问题中运用。以后我们还会发布关于其他内容的教程,敬请期待。原创 2024-06-16 16:19:31 · 1035 阅读 · 0 评论 -
[leetcode] 2269. 找到一个数字的 K 美丽值
1原创 2024-06-16 16:07:06 · 306 阅读 · 0 评论 -
[leetcode] 双指针集锦(python实现)
双指针是一种多用于解决数组/链表问题的简单却非常巧妙的思想。它的主要思路是用两个指针,一个快一个慢或者一个在前一个在后去遍历数据,帮我们降低时间复杂度,解决问题。两数之和/三数之和等问题:在已经排序的数组中用两个指针分别从头和尾向中间扫描,寻找满足条件的元素。链表中寻找中间节点或者是判断链表是否存在环等问题:通过一个快指针(一次移动两格)和一个慢指针(一次移动一格)在遍历的过程中找到解。原创 2024-06-16 12:46:37 · 383 阅读 · 0 评论 -
[AIGC] 请问这个 Trie 树的实现是否可以处理其他字符,而不仅限于小写英文字母?
当然,我们可以对这个实现进行扩展,以处理包含更多类型字符的情况。例如,如果我们想要处理所有ASCII字符(包括大写字母,符号等),可以将链接数组的大小扩展到128,因为ASCII字符集有128个不同的字符。我们的当前Trie树实现主要针对小写字母a-z,因为我们在TrieNode中初始化了一个长度为26的链接数组links,每个index对应a-z中的一个字母。以上的修改可以让Trie树处理的字符范围更广,至于如何选择R的值以及如何访问links[]数组,主要取决于你计划在Trie树中存储何种类型的字符。原创 2024-06-09 21:29:48 · 292 阅读 · 0 评论 -
[AIGC] 字典树Trie树详解及其Java实现
字典树,也称为Trie树或前缀树,是一种常见的搜索数据结构,广泛应用于字符串查询的场景中,比如网络词典的实现,或者是搜索引擎中词语的自动补全。原创 2024-06-09 21:27:01 · 579 阅读 · 0 评论 -
[leetcode] 快乐数 E
链接:https://leetcode.cn/problems/happy-number。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 n 是 快乐数 就返回 true;不是,则返回 false。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。如果这个过程 结果为 1,那么这个数就是快乐数。编写一个算法来判断一个数 n 是不是快乐数。来源:力扣(LeetCode)原创 2024-04-16 22:41:25 · 263 阅读 · 0 评论 -
[leetcode 链表] 反转链表 vs 链表相交
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3。输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。原创 2024-04-14 23:04:14 · 825 阅读 · 1 评论 -
[leetcode] 705. 设计哈希集合
void remove(key) 将给定值 key 从哈希集合中删除。// 返回 False ,(未找到)myHashSet.contains(2);// 返回 False ,(已移除)bool contains(key) 返回哈希集合中是否存在这个值 key。// 返回 True。// 返回 True。void add(key) 向哈希集合中插入值 key。原创 2024-04-14 23:00:49 · 609 阅读 · 0 评论 -
[leetcode ~dp ]279. 完全平方数
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。解释:12 = 4 + 4 + 4。解释:13 = 4 + 9。原创 2024-03-12 22:48:12 · 324 阅读 · 1 评论 -
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
如果 treeNode.val == x 且 treeNode.right!= null,那么 treeNode.right.val == 2 * x + 2。如果 treeNode.val == x 且 treeNode.left!= null,那么 treeNode.left.val == 2 * x + 1。FindElements(TreeNode* root) 用受污染的二叉树初始化对象,你需要先把它还原。解题思路:dfs还原树+还原过程记录出现的value。二叉树的高度不超过 20。原创 2024-03-12 22:38:27 · 637 阅读 · 0 评论 -
[leetcode M] 105. 从前序与中序遍历序列构造二叉树
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]输入: preorder = [-1], inorder = [-1]输出: [3,9,20,null,null,15,7]preorder 和 inorder 均 无重复 元素。inorder 均出现在 preorder。原创 2024-02-21 06:30:00 · 185 阅读 · 1 评论 -
[leetcode] 670. 最大交换 M
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。因为只有8位数,直接穷举,留点头发吧~给定数字的范围是 [0, 108]解释: 交换数字2和数字7。解释: 不需要交换。原创 2024-01-22 21:59:06 · 398 阅读 · 0 评论 -
[leetcode~数位动态规划] 2719. 统计整数数目 hard
给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum。解释:总共有 11 个整数的数位和在 1 到 8 之间,分别是 1,2,3,4,5,6,7,8,10,11 和 12。输入:num1 = “1”, num2 = “12”, min_num = 1, max_num = 8。输入:num1 = “1”, num2 = “5”, min_num = 1, max_num = 5。解释:数位和在 1 到 5 之间的 5 个整数分别为 1,2,3,4 和 5。原创 2024-01-16 23:35:34 · 510 阅读 · 0 评论 -
[leetcode ~go]三数之和 M
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0?因为题目要求输出的是value而不是index,所以为了简单起见,我们上来先来一个排序。链接:https://leetcode.cn/problems/3sum。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]注意:答案中不可以包含重复的三元组。来源:力扣(LeetCode)输入:nums = [0]输入:nums = []原创 2023-12-30 23:56:11 · 596 阅读 · 4 评论 -
[leetcode] 四数之和 M
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]输入:nums = [1,0,-1,0,-2,2], target = 0。链接:https://leetcode.cn/problems/4sum。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。输入:nums = [2,2,2,2,2], target = 8。你可以按 任意顺序 返回答案。输出:[[2,2,2,2]]原创 2023-12-30 23:55:27 · 597 阅读 · 0 评论 -
[算法基础 ~排序] Golang 实现
以下部分动图来自优快云::: tip 稳定性的概念定义:能保证两个相等的数,经过排序之后,其在序列的前后位置顺序不变。(A1=A2,排序前A1在A2前面,排序后A1还在A2前面)意义:稳定性本质是维持具有相同属性的数据的插入顺序,如果后面需要使用该插入顺序排序,则稳定性排序可以避免这次排序。原创 2023-12-11 21:25:18 · 1170 阅读 · 0 评论 -
[leetcode ~字符串]必刷经典题
其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。解释:如果两个单词间有多余的空格,颠倒后的字符串需要将单词间的空格减少到仅有一个。商业转载请联系官方授权,非商业转载请注明出处。原创 2023-12-10 16:58:49 · 1208 阅读 · 1 评论 -
[leetcode 前缀和]
所以,在求前缀和的时候,直接求余数,当出现相同余数的时候,说明当前子数组的前缀和符合倍数要求,然后判断子数组长度,如果符合条件则直接返回。解释:[23, 2, 6, 4, 7] 是大小为 5 的子数组,并且和为 42。解释:[2,4] 是一个大小为 2 的子数组,并且和为 6。输入:nums = [23,2,6,4,7], k = 13。输入:nums = [23,2,4,6,7], k = 6。输入:nums = [23,2,6,4,7], k = 6。的最长连续子数组,并返回该子数组的长度。原创 2023-12-08 23:35:37 · 540 阅读 · 1 评论 -
[leetcode 链表]
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3。输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。插入后,新节点将成为链表的第一个节点。原创 2023-12-08 23:34:49 · 989 阅读 · 0 评论 -
[leetcode 双指针]
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0?输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]输入:nums = [1,0,-1,0,-2,2], target = 0。输入:nums = [2,2,2,2,2], target = 8。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]输出:[[2,2,2,2]]输入:nums = [0]原创 2023-12-06 22:11:04 · 639 阅读 · 3 评论 -
[leetcode 差分数组] 拼车 M
给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi。当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false。输入:trips = [[2,1,5],[3,3,7]], capacity = 4。输入:trips = [[2,1,5],[3,3,7]], capacity = 5。原创 2023-12-06 22:10:13 · 655 阅读 · 0 评论 -
[leetcode ~二叉树] 模版
链接:https://leetcode.cn/problems/sum-of-left-leaves。链接:https://leetcode.cn/problems/invert-binary-tree。输入: root = [3,9,20,null,null,15,7]给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]输入:root = [2,1,3]输入: root = [1]输出:[2,3,1]原创 2023-12-05 06:45:00 · 791 阅读 · 3 评论 -
[leetcode 数组]模版
例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。, numsr-1, numsr] ,并返回其长度。解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。输入:target = 11, nums = [1,1,1,1,1,1,1,1]输入: nums = [-1,0,3,5,9,12], target = 2。输入:nums = [0,1,2,2,3,0,4,2], val = 2。原创 2023-12-05 06:30:00 · 951 阅读 · 0 评论 -
[leetcode 哈希表] 模版
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。输出结果中的每个元素一定是 唯一 的。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]原创 2023-12-04 07:30:00 · 843 阅读 · 2 评论 -
[leetcode ~模版] 周赛模版
以下图模板假设节点编号从 0 到 n - 1 ,并且图是以邻接表的形式给出的。根据问题的不同,您可能需要在使用模板之前将输入转换为等效的。以下图模板假设节点编号从 0 到 n - 1 ,并且图是以邻接表的形式给出的。根据问题的不同,您可能需要在使用模板之前将输入转换为等效的。以下图模板假设节点编号从 0 到 n - 1 ,并且图是以邻接表的形式给出的。根据问题的不同,您可能需要在使用模板之前将输入转换为等效的。分解完之后$2^i, 2^{i+1}, 2^{i+2},…,表示每天的温度,返回一个数组。原创 2023-12-04 07:15:00 · 1414 阅读 · 0 评论 -
[leetcode 数位运算] 2939. 最大异或乘积 M
解释:当 x = 25 时,(a XOR x) = 31 且 (b XOR x) = 30。解释:当 x = 2 时,(a XOR x) = 14 且 (b XOR x) = 7。解释: 当 x = 5 时,(a XOR x) = 4 且 (b XOR x) = 3。所以,(a XOR x) * (b XOR x) = 12。给你三个整数 a ,b 和 n ,请你返回 (a XOR x) * (b XOR x) 的 最大值 且 x 需要满足 0原创 2023-11-22 22:40:38 · 693 阅读 · 0 评论 -
[leetcode 智力题] 2938. 区分黑球与白球 M
给你一个长度为 n 、下标从 0 开始的二进制字符串 s,其中 1 和 0 分别代表黑色和白色的球。返回「将所有黑色球都移到右侧,所有白色球都移到左侧所需的 最小步数」。桌子上有 n 个球,每个球的颜色不是黑色,就是白色。在每一步中,你可以选择两个相邻的球并交换它们。思路: 计算0左边有多少个1即是需要移动的次数。s[i] 不是 ‘0’,就是 ‘1’。解释:所有黑色球都已经在右侧。输入:s = “0111”输入:s = “101”输入:s = “100”原创 2023-11-22 22:39:10 · 477 阅读 · 0 评论 -
[leetcode 数位计算]2520. 统计能整除数字的位数
解释:121 可以被 1 整除,但无法被 2 整除。由于 1 出现两次,所以返回 2。如果满足 nums % val == 0 ,则认为整数 val 可以整除 nums。给你一个整数 num ,返回 num 中能整除 num 的数位的数目。解释:1248 可以被它每一位上的数字整除,因此答案是 4。解释:7 被自己整除,因此答案是 1。输入:num = 1248。输入:num = 121。num 的数位中不含 0。输入:num = 7。原创 2023-10-26 23:06:51 · 444 阅读 · 0 评论 -
[leetcode 哈希表] 2034. 股票价格波动 M
某些情况下,有的记录可能是错的。// 时间戳为 [1,2] ,对应的股票价格为 [10,5]。// 时间戳为 [1,2,4] ,对应价格为 [3,5,2]。// 返回 10 ,最高价格的时间戳为 1 ,价格为 10。// 时间戳为 [1] ,对应的股票价格为 [10]。// 返回 5 ,最新时间戳为 2 ,对应价格为 5。// 返回 2 ,最低价格时间戳为 4 ,价格为 2。// 之前时间戳为 1 的价格错误,价格更新为 3。// 时间戳为 [1,2] ,对应股票价格为 [3,5]。原创 2023-10-26 06:00:00 · 350 阅读 · 2 评论 -
[leetcode 数位运算] 2578.最小分割和
解释:我们可以将 4325 分割成 num1 = 24 和 num2 = 35 ,和为 59 ,59 是最小和。解释:我们可以将 687 分割成 num1 = 68 和 num2 = 7 ,和为最优值 75。换句话说,num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。num1 和 num2 直接连起来,得到 num 各数位的一个排列。num1 和 num2 中数位顺序可以与 num 中数位顺序不同。请你返回 num1 和 num2 可以得到的和的 最小 值。原创 2023-10-25 08:30:00 · 160 阅读 · 0 评论 -
[leetcode 脑子急转弯] 2731. 移动机器人
有一些机器人分布在一条无限长的数轴上,他们初始坐标用一个下标从 0 开始的整数数组 nums 表示。当你给机器人下达命令时,它们以每秒钟一单位的速度开始移动。给你一个字符串 s ,每个字符按顺序分别表示每个机器人移动的方向。‘L’ 表示机器人往左或者数轴的负方向移动,‘R’ 表示机器人往右或者数轴的正方向移动。当两个机器人相撞时,它们开始沿着原本相反的方向移动。请你返回指令重复执行 d 秒后,所有机器人之间两两距离之和。由于答案可能很大,请你将答案对1097取余后返回。原创 2023-10-24 06:00:00 · 401 阅读 · 0 评论 -
[leetcode 优先队列] 2512. 奖励最顶尖的 K 名学生 M
输入:positive_feedback = [“smart”,“brilliant”,“studious”], negative_feedback = [“not”], report = [“this student is not studious”,“the student is smart”], student_id = [1,2], k = 2。不会 有单词同时是正面的和负面的。positive_feedback[i] 和 negative_feedback[j] 都只包含小写英文字母。原创 2023-10-22 16:03:45 · 214 阅读 · 0 评论 -
[leetcode] 2530. 执行 K 次操作后的最大分数 M
最后分数是 10 + 10 + 10 + 10 + 10 = 50。第 1 步操作:选中 i = 1 ,nums 变为 [1,4,3,3,3]。第 2 步操作:选中 i = 1 ,nums 变为 [1,2,3,3,3]。第 3 步操作:选中 i = 2 ,nums 变为 [1,1,1,3,3]。将 nums[i] 替换为 ceil(nums[i] / 3)。输入:nums = [10,10,10,10,10], k = 5。输入:nums = [1,10,3,3,3], k = 3。原创 2023-10-18 21:47:56 · 193 阅读 · 0 评论 -
[leetcode 单调栈] 901. 股票价格跨度 M
设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度。当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。例如,如果未来 7 天股票的价格是 [100,80,60,70,60,75,85],那么股票跨度将是 [1,1,1,2,1,4,6]。实现 StockSpanner 类:StockSpanner() 初始化类对象。int next(int price) 给出今天的股价 price ,返回该股票当日价格的 跨度。原创 2023-10-07 21:32:25 · 239 阅读 · 1 评论