
数据结构与算法
【数据结构与算法 学习&刷题&题解】竞赛 | 笔试 | 面试 | 收录LeetCode Hot100、代码随想录、Acwing、各大互联网企业面试中最常出的经典例题。
蓝染-惣右介
不定期持续分享自己的学习笔记、开发技术领域的文章
展开
-
LeetCode 1768. 交替合并字符串【字符串,双指针】
如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。解释:注意,word2 比 word1 长,“rs” 需要追加到合并后字符串的末尾。解释:注意,word1 比 word2 长,“cd” 需要追加到合并后字符串的末尾。输入:word1 = “abc”, word2 = “pqr”输入:word1 = “ab”, word2 = “pqrs”输入:word1 = “abcd”, word2 = “pq”输出:“apbqcr”输出:“apbqrs”输出:“apbqcd”原创 2023-06-08 23:12:46 · 149 阅读 · 1 评论 -
Acwing 3777. 砖块 【递推】
其中的每个字符都是 W 或 B,如果第 i 个字符是 W,则表示第 i 号砖块是白色的,如果第 i 个字符是 B,则表示第 i 个砖块是黑色的。如果 k>0,则还需再输出一行 k 个整数,p1,p2,…其中 pi 表示第 i 次操作,选中的砖块为 pi 和 pi+1 号砖块。你的目标是通过不超过 3n 次操作,将所有砖块的颜色变得一致。选择两个相邻的砖块,反转它们的颜色。否则,首先输出一行 k,表示需要的操作次数。每个砖块要么是黑色的,要么是白色的。每组数据,如果无解则输出一行 −1。原创 2023-04-07 20:58:12 · 112 阅读 · 0 评论 -
Acwing 848. 有向图的拓扑序列 【图论、拓扑排序】
若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。接下来 m 行,每行包含两个整数 x 和 y,表示存在一条从点 x 到点 y 的有向边 (x,y)。给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。共一行,如果存在拓扑序列,则输出任意一个合法的拓扑序列即可。第一行包含两个整数 n 和 m。原创 2023-04-01 20:25:09 · 138 阅读 · 0 评论 -
Acwing 3305. 作物杂交 【图论、SPFA】
输入的第 1 行包含 4 个整数 N,M,K,T,N 表示作物种类总数 (编号 1 至 N),M 表示初始拥有的作物种子类型数量,K 表示可以杂交的方案数,T 表示目标种子的编号。第 4 至 K+3 行,每行包含 3 个整数 A,B,C,表示第 A 类作物和第 B 类作物杂交可以获得第 C 类作物的种子。第 6 天至第 10 天,将编号 1 与编号 3 的作物杂交,得到编号 4 的作物种子。第 1 天至第 5 天,将编号 1 与编号 2 的作物杂交,得到编号 3 的作物种子。原创 2023-03-28 21:25:06 · 91 阅读 · 0 评论 -
Acwing 1137. 选择最佳线路【图论、单源最短路】
接下来一行,包含一个整数 w,表示琪琪家附近共有 w 个车站,她可以在这 w 个车站中选择一个车站作为始发站。每组测试数据第一行包含三个整数 n,m,s,分别表示车站数量,公交线路数量以及朋友家附近车站的编号。接下来 m 行,每行包含三个整数 p,q,t,表示存在一条线路从车站 p 到达车站 q,用时为 t。每条公交线路都是 单向的,从一个车站出发直接到达另一个车站,两个车站之间可能存在多条公交线路。再一行,包含 w 个整数,表示琪琪家附近的 w 个车站的编号。如果无法达到朋友家的车站,则输出 -1。原创 2023-03-28 20:22:58 · 131 阅读 · 0 评论 -
AcWing 920. 最优乘车【图论、单元最短路、BFS】
从第二行到第 M+1 行依次给出了第 1 条到第 M 条巴士线路的信息,其中第 i+1 行给出的是第 i 条巴士线路的信息,从左至右按运行顺序依次给出了该线路上的所有站号,相邻两个站号之间用一个空格隔开。一名旅客最近到 H 城旅游,他很想去 S 公园游玩,但如果从他所在的饭店没有一路巴士可以直接到达 S 公园,则他可能要先乘某一路巴士坐几站,再下来换乘同一站台的另一路巴士,这样换乘几次后到达 S 公园。N 给 H 城的所有的巴士站编号,约定这名旅客所在饭店的巴士站编号为 1,S 公园巴士站的编号为 N。原创 2023-03-28 19:00:13 · 114 阅读 · 0 评论 -
Acwing 1126. 最小花费【图论、单源最短路】
以下 m 行每行输入三个正整数 x,y,z,表示标号为 x 的人和标号为 y 的人之间互相转账需要扣除 z% 的手续费 ( z原创 2023-03-27 10:19:08 · 127 阅读 · 0 评论 -
Acwing 1127. 香甜的黄油 【图论、单源最短路】
第 N+2 行到第 N+C+1 行:每行有三个数:相连的牧场A、B,两牧场间距 D,当然,连接是双向的。农夫John很狡猾,就像以前的巴甫洛夫,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)。把糖放在一片牧场上,他知道 N 只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。第一行: 三个数:奶牛数 N,牧场数 P,牧场间道路数 C。共一行,输出奶牛必须行走的最小的距离和。原创 2023-03-27 09:42:08 · 97 阅读 · 0 评论 -
Acwing 1488. 最短距离 【图论、单源最短路】
接下来 M 行,每行包含三个整数 ai,bi,ci,表示第 i 条道路连接村庄 ai 和村庄 bi,长度是 ci。接下来 Q 行,每行包含一个整数 yk,表示询问编号为 yk 的村庄与其距离最近的商店之间的距离。然后给出 Q 个询问,第 k 个询问给出一个村庄的编号 yk,问该村庄距离最近的商店有多远?村庄之间有 M 条无向道路,第 i 条道路连接村庄 ai 和村庄 bi,长度是 ci。接下来 K 行,每行包含一个整数 xj,表示第 j 个有商店的村庄编号是 xj。对于每个询问,输出该询问的结果。原创 2023-03-26 20:56:24 · 109 阅读 · 0 评论 -
Acwing 1128. 信使 【图论、单源最短路】
第 2 至 m+1 行:每行三个整数 i、j、k,中间用 1 个空格隔开,表示第 i 个和第 j 个哨所之间存在 双向 通信线路,且这条线路要花费 k 天。因为准备充足,每个哨所内都安排了足够的信使(如果一个哨所与其他 k 个哨所有通信联系的话,这个哨所内至少会配备 k 个信使)。当一个哨所接到信后,这个哨所内的信使们也以同样的方式向其他哨所送信。战争时期,前线有 n 个哨所,每个哨所可能会与其他若干个哨所之间有通信联系。当指挥部下达一个命令后,指挥部就派出若干个信使向与指挥部相连的哨所送信。原创 2023-03-26 20:38:19 · 96 阅读 · 0 评论 -
Acwing 1129. 热浪 【图论、单源最短路】
第 2 到第 C+1 行: 第 i+1 行描述第 i 条道路,包含 3 个由空格隔开的整数: Rs,Re,Ci。农夫John此时身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。除了起点和终点外的每个城镇都由 双向道路 连向至少两个其它的城镇。每条道路由道路的起点 Rs,终点 Re 和花费 Ci 组成。求从起始的城镇 Ts 到终点的城镇 Te 最小的总费用。德克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪!一个单独的整数表示从 Ts 到 Te 的最小总费用。原创 2023-03-26 20:08:27 · 119 阅读 · 0 评论 -
LeetCode 1005. K 次取反后最大化的数组和【贪心算法、排序】
那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大,全局最优:整个 数组和 达到最大。解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2]。解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4]。输入:nums = [2,-3,-1,5,-4], k = 2。解释:选择下标 1 ,nums 变为 [4,-2,3]。输入:nums = [3,-1,0,2], k = 3。输入:nums = [4,2,3], k = 1。原创 2023-03-24 00:38:25 · 81 阅读 · 0 评论 -
LeetCode 45. 跳跃游戏 II【贪心算法】
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。输入: nums = [2,3,1,1,4]解释: 跳到最后一个位置的最小跳跃数是 2。输入: nums = [2,3,0,1,4]题目保证可以到达 nums[n-1]原创 2023-03-23 00:09:32 · 338 阅读 · 0 评论 -
LeetCode 55. 跳跃游戏【贪心算法】
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。给定一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。输入:nums = [2,3,1,1,4]输入:nums = [3,2,1,0,4]判断你是否能够到达最后一个下标。原创 2023-03-22 23:27:01 · 444 阅读 · 0 评论 -
LeetCode 122. 买卖股票的最佳时机 II【贪心算法、动态规划】
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。输入:prices = [7,1,5,3,6,4]原创 2023-03-22 23:06:47 · 102 阅读 · 0 评论 -
LeetCode 53. 最大子数组和【贪心算法、动态规划】
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。输入:nums = [-2,1,-3,4,-1,2,1,-5,4]如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的。解释:连续子数组 [4,-1,2,1] 的和最大,为 6。输入:nums = [5,4,-1,7,8]子数组 是数组中的一个连续部分。输入:nums = [1]原创 2023-03-21 23:19:31 · 110 阅读 · 0 评论 -
LeetCode 376. 摆动序列【贪心算法、动态规划】
其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8)。不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。解释:整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3)。输入:nums = [1,17,5,10,13,15,10,5,16,8]输入:nums = [1,2,3,4,5,6,7,8,9]输入:nums = [1,7,4,9,2,5]原创 2023-03-18 00:44:53 · 72 阅读 · 0 评论 -
LeetCode 455. 分发饼干【贪心算法、排序】
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。,这是能让孩子们满足胃口的饼干的最小尺寸;你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。输入: g = [1,2,3], s = [1,1]输入: g = [1,2], s = [1,2,3]你拥有的饼干数量和尺寸都足以让所有孩子满足。原创 2023-03-17 23:43:02 · 85 阅读 · 0 评论 -
LeetCode 18. 四数之和【双指针】
输出:[[-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。请你找出并返回满足下述全部条件且。输出:[[2,2,2,2]]原创 2023-03-08 19:43:10 · 85 阅读 · 0 评论 -
LeetCode 15. 三数之和【双指针】
不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]给你一个整数数组 nums ,判断是否存在三元组。输出:[[-1,-1,2],[-1,0,1]]注意,输出的顺序和三元组的顺序并不重要。注意:答案中不可以包含重复的三元组。解释:唯一可能的三元组和不为 0。输入:nums = [0,1,1]输入:nums = [0,0,0]解释:唯一可能的三元组和为 0。输出:[[0,0,0]]原创 2023-03-08 18:20:05 · 90 阅读 · 0 评论 -
LeetCode 1. 两数之和【哈希表】
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。输入:nums = [2,7,11,15], target = 9。输入:nums = [3,2,4], target = 6。输入:nums = [3,3], target = 6。原创 2023-03-08 16:03:38 · 117 阅读 · 0 评论 -
LeetCode 454. 四数相加 II【哈希表】
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:0原创 2023-03-08 16:02:58 · 94 阅读 · 0 评论 -
AcWing 1562. 微博转发【图论,BFS】
当用户在微博上发布帖子时,他/她的所有关注者都可以查看并转发他/她的帖子,然后这些人的关注者可以对内容再次转发…最后一行首先包含一个整数 K,表示询问次数,然后包含 K 个用户编号,表示询问这些人的帖子的最大可能转发量。如果 B 是 A 的关注者,C 是 B 的关注者,那么 A 的第一层关注者是 B,第二层关注者是 C。现在给定一个社交网络,假设只考虑 L 层关注者,请你计算某些用户的帖子的最大可能转发量。第一行包含两个整数,N 表示用户数量,L 表示需要考虑的关注者的层数。是第 i 名用户关注的总人数,原创 2023-03-07 22:26:51 · 167 阅读 · 0 评论 -
AcWing 165. 小猫爬山【DFS,剪枝】
每租用一辆缆车,翰翰和达达就要付 1 美元,所以他们想知道,最少需要付多少美元才能把这 N 只小猫都运送下山?N+1 行:每行一个整数,其中第 i+1 行的整数表示第 i 只小猫的重量 Ci。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_原创 2023-03-07 21:25:50 · 201 阅读 · 0 评论 -
LeetCode 37. 解数独【数组,回溯算法】
board[i][j] 是一位数字或者 ‘.’编写一个程序,通过填充空格来解决数独问题。数独部分空格内已填入了数字,空白格用。题目数据 保证 输入数独仅有一个解。在每一个以粗实线分隔的。在每一行只能出现一次。在每一列只能出现一次。原创 2023-03-07 19:17:07 · 96 阅读 · 0 评论 -
LeetCode 51. N 皇后【数组,回溯算法】
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。解释:如上图所示,4 皇后问题存在两个不同的解法。输出:[[“Q”]]原创 2023-03-07 18:15:23 · 100 阅读 · 0 评论 -
LeetCode 491. 递增子序列【数组,回溯算法,哈希表去重】
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素。你可以按 任意顺序 返回答案。输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。输入:nums = [4,4,3,2,1]输入:nums = [4,6,7,7]输出:[[4,4]]原创 2023-03-06 18:50:21 · 55 阅读 · 0 评论 -
LeetCode 93. 复原 IP 地址【字符串,回溯算法】
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]输入:s = “101023”原创 2023-03-06 15:35:30 · 166 阅读 · 0 评论 -
LeetCode 40. 组合总和 II【数组,回溯算法,排序去重】
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。原创 2023-03-05 15:57:24 · 56 阅读 · 0 评论 -
LeetCode 17. 电话号码的字母组合【回溯算法】
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。原创 2023-03-05 14:28:00 · 53 阅读 · 0 评论 -
LeetCode 215. 数组中的第K个最大元素【数组,快速选择,堆】
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。原创 2023-03-05 13:24:57 · 96 阅读 · 0 评论 -
LeetCode 216. 组合总和 III【回溯算法】
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:只使用数字1到9,每个数字最多使用一次。返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。原创 2023-03-05 00:38:56 · 57 阅读 · 0 评论 -
LeetCode 79. 单词搜索【回溯算法】
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。原创 2023-03-05 00:35:25 · 62 阅读 · 0 评论 -
LeetCode 77. 组合【回溯算法】
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。输入:n = 4, k = 2。输入:n = 1, k = 1。来源:力扣(LeetCode)原创 2023-03-05 00:04:56 · 59 阅读 · 0 评论 -
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置【数组、二分查找】
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。输入:nums = [5,7,7,8,8,10], target = 8。输入:nums = [5,7,7,8,8,10], target = 6。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。如果数组中不存在目标值 target,返回 [-1, -1]。输入:nums = [], target = 0。输出:[-1,-1]输出:[-1,-1]原创 2023-03-04 17:46:19 · 72 阅读 · 0 评论 -
LeetCode 35. 搜索插入位置【数组、二分查找】
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。输入: nums = [1,3,5,6], target = 7。请必须使用时间复杂度为 O(log n) 的算法。nums 为 无重复元素 的 升序 排列数组。查找>=target的最左侧的那个数的位置。来源:力扣(LeetCode)原创 2023-03-04 17:45:37 · 77 阅读 · 0 评论 -
LeetCode 704. 二分查找【数组、二分查找】
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。输入: nums = [-1,0,3,5,9,12], target = 9。输入: nums = [-1,0,3,5,9,12], target = 2。nums 的每个元素都将在 [-9999, 9999]之间。解释: 2 不存在 nums 中因此返回 -1。n 将在 [1, 10000]之间。来源:力扣(LeetCode)原创 2023-03-04 11:19:23 · 56 阅读 · 0 评论