刷题经验
一只程序小洋
一步一步,皆是进步!!
展开
-
记录LC:两数相加
给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头。class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { //定义一个新联表伪指针,用来指向头指针,返回结果 ListNod...原创 2022-03-06 15:13:08 · 420 阅读 · 0 评论 -
连续01的字符串:——LC696
题目:给定一个 0-1 字符串,求有多少非空子字符串的 0 和 1 数量相同。思路:从左往右遍历数组,记录和当前位置数字相同且连续的长度,以及其之前连续的不同数字的长度。举例来说,对于 00110 的最后一位,我们记录的相同数字长度是 1,因为只有一个连续 0;我们记录的不同数字长度是 2,因为在 0 之前有两个连续的 1。若不同数字的连续长度大于等于当前数字的连续长度,则说明存在一个且只存在一个以当前数字结尾的满足条件的子字符串。class Solution { publi原创 2021-09-01 21:05:24 · 333 阅读 · 0 评论 -
判断回文字符串:——LC647(多看)
题目:给定一个字符,求其有多少个回文子字符串。回文的定义是左右对称。思路:可以从字符串的每个位置开始,向左向右延长,判断存在多少以当前位置为中轴的回文子字符串。class Solution { public int countSubstrings(String s) {int n = s.length(),ans = 0;for (int i = 0; i<2*n-1; ++i){ int l = i / 2, r = i / 2 + i % 2; wh原创 2021-09-01 20:54:54 · 157 阅读 · 0 评论 -
字符串是否同构:——LC205
题目:判断两个字符串是否同构。同构的定义是,可以通过把一个字符串的某些相同的字符转换成另一些相同的字符,使得两个字符串相同,且两种不同的字符不能够被转换成同一种字符。思路:1.大概思路将问题转化一下:记录两个字符串每个位置的字符第一次出现的位置,如果两个字符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。举例来说,对于“paper”和“title”,假设我们现在遍历到第三个字符“p”和“t”,发现它们第一次出现的位置都在第一个字符,则说明目前位置满足同构。2.具体思原创 2021-09-01 20:47:00 · 384 阅读 · 0 评论 -
字符串比较:——LC242
题目:判断两个字符串包含的字符是否完全相同。思路:class Solution { public boolean isAnagram(String s, String t) { if (s.length() != t.length() ){ return false; } Map<Character,Integer> table = new HashMap<Character, Integer>(); for (int i原创 2021-09-01 20:31:47 · 89 阅读 · 0 评论 -
前缀和与积分图:和为k的子数组——03
题目:给定一个数组,寻找和为 k 的连续区间个数。输入一个一维整数数组和一个整数值 k;输出一个整数,表示满足条件的连续区间个数。思路:使用一个哈希表 hashmap,其键是前缀和,而值是该前缀和出现的次数。在我们遍历到位置 i 时,假设当前的前缀和是 psum,那么 hashmap[psum-k]即为以当前位置结尾、满足条件的区间个数。class Solution { public int subarraySum(int[] nums, int k) { int c原创 2021-08-22 21:23:44 · 94 阅读 · 0 评论 -
前缀和与积分图:二维区域和检索——02
1.题目:1.设计一个数据结构,使得其能够快速查询给定矩阵中,任意两个位置包围的长方形中所有数字的和。2.中 sumRegion 函数的四个输入分别是第一个点的横、纵坐标,和第二个点的横、纵坐标。2.思路:类似于前缀和,可以把这种思想拓展到二维,即积分图(image integral)。我们可以先建立一个 intergral 矩阵,intergral[i][j] 表示以位置 (0, 0) 为左上角、位置 (i, j) 为右下角的长方形中所有数字的和。我们可以用动态规划来计算 inte原创 2021-08-22 21:11:07 · 181 阅读 · 0 评论 -
前缀和与积分图:区域和搜索——01
1.相关概念:一维的前缀和,二维的积分图,都是把每个位置之前的一维线段或二维矩形预先存储,方便加速计算。如果需要对前缀和或积分图的值做寻址,则要存在哈希表里;如果要对每个位置记录前缀和或积分图的值,则可以储存到一维或二维数组里,也常常伴随着动态规划。2.题目:设计一个数据结构,使得其能够快速查询给定数组中,任意两个位置间所有数字的和。3.思路:C++版本对于一维的数组,我们可以使用前缀和来解决此类问题。先建立一个与数组 nums 长度相同的新数组 psum,表示 nums 每原创 2021-08-22 20:50:20 · 203 阅读 · 0 评论 -
多重集合和映射:重新安排行程(欧拉图—重点学习)
题目:给定一个人坐过的一些飞机的起止机场,已知这个人从 JFK 起飞,那么这个人是按什么顺序飞的;如果存在多种可能性,返回字母序最小的那种。思路及其欧拉图:思路1:先用哈希表记录起止机场,其中键是起始机场,值是一个多重集合,表示对应的终止机场。因为一个人可能坐过重复的线路,所以我们需要使用多重集合储存重复值。储存完成之后,我们可以利用栈来恢复从终点到起点飞行的顺序,再将结果逆序得到从起点到终点的顺序。化简本题题意:给定一个 n 个点 m 条边的图,要求从指定的顶点出发,经过所有的边恰好原创 2021-08-19 21:57:03 · 175 阅读 · 0 评论 -
哈希表:直线上最多的点——03(hard)
题目:给定一些二维坐标中的点,求同一条线上最多由多少点。思路:对于每个点,我们对其它点建立哈希表,统计同一斜率的点一共有多少个。这里利用的原理是,一条线可以由一个点和斜率而唯一确定。另外也要考虑斜率不存在和重复坐标的情况。本题也利用了一个小技巧:在遍历每个点时,对于数组中位置 i 的点,我们只需要考虑 i 之后的点即可,因为 i 之前的点已经考虑过 i 了。四个小优化:1.在点的总数量小于等于 2 的情况下,我们总可以用一条直线将所有点串联,此时我们直接返回点的总数量即可;2.当原创 2021-08-19 21:30:03 · 214 阅读 · 0 评论 -
哈希表:最长连续序列——02
题目:给定一个整数数组,求这个数组中的数字可以组成的最长连续序列有多长。思路:可以把所有数字放到一个哈希表,然后不断地从哈希表中任意取一个值,并删除掉其之前之后的所有连续数字,然后更新目前的最长连续序列长度。重复这一过程,我们就可以找到所有的连续数字序列。class Solution { public int longestConsecutive(int[] nums) { Set<Integer> num_set = new HashSet<Inte原创 2021-08-19 21:05:54 · 129 阅读 · 0 评论 -
哈希表:两数之和——01
哈希表,又称散列表,使用 O(n) 空间复杂度存储数据,通过哈希函数映射位置,从而实现近似 O(1) 时间复杂度的插入、查找、删除等操作。 C++ 中的哈希集合为 unordered_set,可以查找元素是否在集合中。如果需要同时存储键和值,则需要用 unordered_map,可以用来统计频率,记录内容等等。如果元素有穷,并且范围不大,那么可以用一个固定大小的数组来存储或统计元素。例如我们需要统计一个字符串中所有字母的出现次数,则可以用一个长度为 26 的数组来进行统计,其哈希...原创 2021-08-19 20:42:23 · 199 阅读 · 0 评论 -
双端队列:滑动窗口最大值——01
题目:输入是一个一维整数数组,和一个表示滑动窗口大小的整数;输出是一个一维整数数组,表示每个时刻时的窗口内最大值。思路: 1.利用双端队列进行操作:每当向右移动时,把窗口左端的值从队列左端剔除,把队列右边小于窗口右端的值全部剔除。这样双端队列的最左端永远是当前窗口内的最大值。另外,这道题也是单调栈的一种延申:该双端队列利用从左到右递减来维持大小关系。 2.遍历数组,将 数 存放在双向队列中,并用 L,R 来标记窗口的左边界和右边界。队列中保存的并不是真的 数,而...原创 2021-08-19 20:32:31 · 308 阅读 · 0 评论 -
优先队列:天际线问题——02(重点学习)
题目:给定建筑物的起止位置和高度,返回建筑物轮廓(天际线)的拐点。输入是一个二维整数数组,表示每个建筑物的 [左端, 右端, 高度];输出是一个二维整数数组,表示每个拐点的横纵坐标。思路:优先队列来优化寻找最大高度的时间,在我们从左到右枚举横坐标的过程中,实时地更新该优先队列即可。这样无论何时,优先队列的队首元素即为最大高度。为了维护优先队列,我们需要使用「延迟删除」的技巧,即我们无需每次横坐标改变就立刻将优先队列中所有不符合条件的元素都删除,而只需要保证优先队列的队首元素「包含该横坐标」原创 2021-08-17 21:51:08 · 270 阅读 · 0 评论 -
优先队列:合并k和升序链表——01(重点学习)
优先队列介绍:优先队列(priority queue)可以在 O(1) 时间内获得最大值,并且可以在 O(log n) 时间内取出最大值或插入任意值。优先队列常常用堆(heap)来实现。堆是一个完全二叉树,其每个节点的值总是大于等于子节点的值。实际实现堆时,我们通常用一个数组而不是用指针建立一个树。这是因为堆是完全二叉树,所以用数组表示时,位置 i 的节点的父节点位置一定为 i/2,而它的两个子节点的位置又一定分别为 2i 和 2i+1。以下是堆的实现方法,其中最核心的两个操作是上浮和下沉:如原创 2021-08-17 21:33:17 · 143 阅读 · 0 评论 -
单调栈:每日温度——01
题目:给定每天的温度,求对于每一天需要等几天才可以等到更暖和的一天。如果该天之后不存在更暖和的天气,则记为 0。思路:我们可以维持一个单调递减的栈,表示每天的温度;为了方便计算天数差,我们这里存放位置(即日期)而非温度本身。我们从左向右遍历温度数组,对于每个日期 p,如果 p 的温度比栈顶存储位置 q 的温度高,则我们取出 q,并记录 q 需要等待的天数为 p − q;我们重复这一过程,直到 p 的温度小于等于栈顶存储位置的温度(或空栈)时,我们将 p 插入栈顶,然后考虑下一天。在这个原创 2021-08-17 21:02:08 · 125 阅读 · 0 评论 -
栈与队列:匹配括号字符串——03
题目:给定一个只由左右原括号、花括号和方括号组成的字符串,求这个字符串是否合法。合法的定义是每一个类型的左括号都有一个右括号一一对应,且括号内的字符串也满足此要求。思路:括号匹配是典型的使用栈来解决的问题。我们从左往右遍历,每当遇到左括号便放入栈内,遇到右括号则判断其和栈顶的括号是否是统一类型,是则从栈内取出左括号,否则说明字符串不合法。结合代码理清思路:class Solution { public boolean isValid(String s) {原创 2021-08-16 22:05:22 · 312 阅读 · 0 评论 -
栈与队列:查询栈内最小值——02
题目:设计一个最小栈,除了需要支持常规栈的操作外,还需要支持在 O(1) 时间内查询栈内最小值的功能。思路: 1.我们可以额外建立一个新栈,栈顶表示原栈里所有值的最小值。每当在原栈里插入一个数字时,若该数字小于等于新栈栈顶,则表示这个数字在原栈里是最小值,我们将其同时插入新栈内。每当从原栈里取出一个数字时,若该数字等于新栈栈顶,则表示这个数是原栈里的最小值之一,我们同时取出新栈栈顶的值。 2.一个写起来更简单但是时间复杂度略高的方法是,我们每次插入原栈...原创 2021-08-16 21:51:20 · 216 阅读 · 0 评论 -
栈与队列:双栈实现队列——01
题目:尝试使用栈(stack)来实现队列(queue)。思路: 我们可以用两个栈来实现一个队列:因为我们需要得到先入先出的结果,所以必定要通过一个额外栈翻转一次数组。这个翻转过程既可以在插入时完成,也可以在取值时完成。 队列是一种 先进先出(first in - first out, FIFO)的数据结构,队列中的元素都从后端(rear)入队(push),从前端(front)出队(pop)。实现队列最直观的方法是用链表,但在这篇文章里我会介绍另一个方法 - 使用栈。...原创 2021-08-16 21:35:04 · 121 阅读 · 0 评论 -
数组:最多能完成排序的块——04
题目:给定一个含有 0 到 n 整数的数组,每个整数只出现一次,求这个数组最多可以分割成多少个子数组,使得对每个子数组进行增序排序后,原数组也是增序的。思路:从左往右遍历,同时记录当前的最大值,每当当前最大值等于数组位置时,我们可以多一次分割。为什么可以通过这个算法解决问题呢?如果当前最大值大于数组位置,则说明右边一定有小于数组位置的数字,需要把它也加入待排序的子数组;又因为数组只包含不重复的 0 到 n,所以当前最大值一定不会小于数组位置。所以每当当前最大值等于数组位置时,假设为 p原创 2021-08-16 21:18:32 · 94 阅读 · 0 评论 -
数组:快速搜索——03
题目:给定一个二维矩阵,已知每行和每列都是增序的,尝试设计一个快速搜索一个数字是否在矩阵中存在的算法。简单的技巧:我们可以从右上角开始查找,若当前值大于待搜索值,我们向左移动一位;若当前值小于待搜索值,我们向下移动一位。如果最终移动到左下角时仍不等于待搜索值,则说明待搜索值不存在于矩阵中。注意补充:这里是对“方法四”的“如何选出发点”的补充: 选左上角,往右走和往下走都增大,不能选 选右下角,往上走和往左走都减小,不能选 选左下角,往右走增大,往上走减小,原创 2021-08-16 21:08:25 · 155 阅读 · 0 评论 -
数组:原地旋转数组——02
题目:给定一个 n × n 的矩阵,求它顺时针旋转 90 度的结果,且必须在原矩阵上修改(in-place)。怎样能够尽量不创建额外储存空间呢?思路:利用一个中间数teclass Solution { public void rotate(int[][] matrix) { int n = matrix.length; for (int i = 0; i < n/2; ++i){ for (int j = 0;j<(n+1)/2;原创 2021-08-16 21:01:17 · 166 阅读 · 0 评论 -
数组:记录数组未出现的数——01
题目:给定一个长度为 n 的数组,其中包含范围为 1 到 n 的整数,有些整数重复了多次,有些整数没有出现,求 1 到 n 中没有出现过的整数。思路:我们可以用一个哈希表记录数组 nums 中的数字,由于数字范围均在[1,n] 中,记录数字后我们再利用哈希表检查 [1,n] 中的每一个数是否出现,从而找到缺失的数字。由于数字范围均在 [1,n] 中,我们也可以用一个长度为 n 的数组来代替哈希表。这一做法的空间复杂度是 O(n) 的。我们的目标是优化空间复杂度到 O(1)。注意到nums原创 2021-08-16 20:46:07 · 277 阅读 · 0 评论 -
学习总结:C++中STL的数据结构
1.STL介绍STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。2.C++STL提供的数据结构1. Sequence Containers:维持顺序的容器。原创 2021-08-16 20:22:23 · 3339 阅读 · 0 评论 -
给定一个整数,判断它是否是 4 的次方。
思路解析:首先我们考虑一个数字是不是 2 的(整数)次方:如果一个数字 n 是 2 的整数次方,那么它的二进制一定是 0...010...0 这样的形式;考虑到 n − 1 的二进制是 0...001...1,这两个数求按位与的结果一定是 0。因此如果 n & (n - 1) 为 0,那么这个数是 2 的次方。如果这个数也是 4 的次方,那二进制表示中 1 的位置必须为奇数位。我们可以把 n 和二进制的 10101...101(即十进制下的 1431655765)做按位与,如果结果不为原创 2021-08-13 20:15:10 · 363 阅读 · 0 评论 -
学习总结:链表随机节点——(LC382)
题目:给定一个单向链表,要求设计一个算法,可以随机取得其中的一个数字。输入是一个单向链表,输出是一个数字,表示链表里其中一个节点的值。思路:蓄水池抽样算法最近经常能看到面经中出现在大数据流中的随机抽样问题即:当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据,并且要保证每个数据被抽取到的概率相等。当 k = 1 时,即此题的情况也就是说,我们每次只能读一个数据。假设数据流含有N个数,我们知道如果要保证所有的数被抽到的概率相等,那么每个数抽到的概率应该为原创 2021-08-11 21:39:22 · 247 阅读 · 0 评论 -
学习总结:按权重随机选择——(LC528)(比较重要)
题目:给定一个数组,数组每个位置的值表示该位置的权重,要求按照权重的概率去随机采样。输入是一维正整数数组,表示权重;和一个包含指令字符串的一维数组,表示运行几次随机采样。输出是一维整数数组,表示随机采样的整数在数组中的位置。补充一些实战场景,以加深记忆(面试会加分吗 XD)Spring Cloud Ribbon (客户端负载均衡)策略中的WeightedResponseTimeRule 此题可简述为「按权重,看作多个区间,按区间宽度越大,概率越大」 在 Ribbon 相关架构中,.原创 2021-08-11 21:16:54 · 222 阅读 · 0 评论 -
学习总结:随机与取样:打乱数组(LC384)
题目:给定一个数组,要求实现两个指令函数。第一个函数“shuffle”可以随机打乱这个数组,第二个函数“reset”可以恢复原来的顺序。思路:Fisher-Yates 洗牌算法可以用一个简单的技巧来降低之前算法的时间复杂度和空间复杂度,那就是让数组中的元素互相交换,这样就可以避免掉每次迭代中用于修改列表的时间了。Fisher-Yates 洗牌算法Fisher-Yates 洗牌算法跟暴力算法很像。在每次迭代中,生成一个范围在当前下标到数组末尾元素下标之间的随机整数。接下来,将当前元素和随..原创 2021-08-11 20:56:32 · 161 阅读 · 0 评论 -
巧解数学问题-05
题目:判断一个数字是否是 3 的次方。题解:找出数字n是否是数字b的幂的一个简单方法是,n%3只要余数为 0,就一直将n除以b。class Solution { public boolean isPowerOfThree(int n) { if(n<1){ return false; } while(n%3==0){ n/=3; } return n==1; }}...原创 2021-08-10 22:24:00 · 97 阅读 · 0 评论 -
巧解数学问题-04
题目:给定两个由数字组成的字符串,求它们相加的结果。题解思路:因为相加运算是从后往前进行的,所以可以先翻转字符串,再逐位计算。这种类型的题考察的是细节,如进位、位数差等等。结合代码去思考思路最好:class Solution { public String addStrings(String num1, String num2) { StringBuilder res=new StringBuilder(""); int i=num1.length()-1,j=nu原创 2021-08-10 22:09:51 · 170 阅读 · 0 评论 -
巧解数学问题-03
题目:给定一个非负整数,判断它的阶乘结果的结尾有几个 0。题解:我们可以检查55的幂,而不是每次除以55来计算因子数。这是通过检查i是否可以被55,2525,125125等整除来实现的。class Solution { public int trailingZeroes(int n) {int count=0;for(int i=5;i<=n;i+=5){ int powerOf5=5; while(i%powerOf5==0){ ...原创 2021-08-10 21:44:24 · 128 阅读 · 0 评论 -
巧解数学问题-02
题目:输入一个整数,输出一个字符串,表示其七进制题解:进制转换类型的题,通常是利用除法和取模(mod)来进行计算,同时也要注意一些细节,如负数和零。如果输出是数字类型而非字符串,则也需要考虑是否会超出整数上下界。class Solution { int[] nums={1,7,49,343,2401,16807,117649,823543,5764801}; public String convertToBase7(int num) { int tmp=0;原创 2021-08-10 21:26:52 · 108 阅读 · 0 评论 -
巧解数学问题-01
题目:给定一个数字 n,求小于 n 的质数的个数。质数又称素数,指的是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。值得注意的是,每一个数都可以分解成质数的乘积。题解:埃拉托斯特尼筛法(Sieve of Eratosthenes,简称埃氏筛法)是非常常用的,判断一个整数是否是质数的方法。并且它可以在判断一个整数 n 时,同时判断所小于 n 的整数,因此非常适合这道题。其原理也十分易懂:从 1 到 n 遍历,假设当前遍历到 m,则把所有小于 n 的、且是 m 的倍原创 2021-08-10 21:14:04 · 391 阅读 · 0 评论 -
化繁为简的分治法:——(LC241(我太菜了做得头疼))
题目:给定一个只包含加、减和乘法的数学表达式,求通过加括号可以得到多少种不同的结果输入是一个字符串,表示数学表达式;输出是一个数组,存储所有不同的加括号结果。题解:顾名思义,分治问题由“分”(divide)和“治”(conquer)两部分组成,通过把原问题分为子问题,再将子问题进行处理合并,从而实现对原问题的求解。例如:在排序章节展示的归并排序就是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为 1 的子数组;“治”即为把已经排好序的两个原创 2021-08-07 21:50:16 · 118 阅读 · 0 评论 -
经典动态规划:股票交易——(LC309)
题目:给定一段时间内每天的股票价格,已知每次卖出之后必须冷却一天,且每次只能拥有一支股票,求最大的收益。思路:我们用 f[i]表示第 i天结束之后的「累计最大收益」。根据题目描述,由于我们最多只能同时买入(持有)一支股票,并且卖出股票后有冷冻期的限制,因此我们会有三种不同的状态:我们目前持有一支股票,对应的「累计最大收益」记为 f[i][0];我们目前不持有任何股票,并且处于冷冻期中,对应的「累计最大收益」记为 f[i][1];我们目前不持有任何股票,并且不处于冷冻期中,对应的「.原创 2021-08-06 21:48:42 · 258 阅读 · 0 评论 -
经典动态规划:股票交易——(LC188(脑壳痛))
题目:给定一段时间内每天的股票价格,已知你只可以买卖各 k 次,且每次只能拥有一支股票,求最大的收益。输入一个一维整数数组,表示每天的股票价格;以及一个整数,表示可以买卖的次数 k。输出一个整数,表示最大的收益。思路:使用一系列变量存储「买入」的状态,再用一系列变量存储「卖出」的状态,通过动态规划的方法即可解决本题。我们用 buy[i][j] 表示对于数组 prices[0..i] 中的价格而言,进行恰好 jj笔交易,并且当前手上持有一支股票,这种情况下的最大利润;用 sell[i]原创 2021-08-06 21:27:58 · 264 阅读 · 0 评论 -
经典动态规划:股票交易——(LC121)
题目:给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。题解:如果我是在历史最低点买的股票就好,在题目中,我们只要用一个变量记录一个历史最低价格 minprice,我们就可以假设自己的股票是在那天买的。那么我们在第 i 天卖出股票能得到的利润就...原创 2021-08-06 21:00:28 · 107 阅读 · 0 评论 -
经典动态规划:字符串编辑——(LC10困难)
题目:输入是一个待匹配字符串和一个用字符串表示的正则表达式,输出是一个布尔值,表示是否可以匹配成功。题解思路:状态:首先状态 dp 一定能自己想出来。dp[i][j] 表示 s 的前 ii个是否能被 p 的前 jj个匹配转移方程:怎么想转移方程?首先想的时候从已经求出了 dp[i-1][j-1] 入手,再加上已知 s[i]、p[j],要想的问题就是怎么去求 dp[i][j]。已知 dp[i-1][j-1] 意思就是前面子串都匹配上了,不知道新的一位的情况。那就分情况考虑,所以对于原创 2021-08-03 22:13:42 · 110 阅读 · 0 评论 -
动态规划:字符串编辑——(LC650)
题目:给定一个字母 A,已知你可以每次选择复制全部字符,或者粘贴之前复制的字符,求最少需要几次操作可以把字符串延展到指定长度输入是一个正整数,代表指定长度;输出是一个整数,表示最少操作次数。C++题解:总体思路:对每一个格子i(i个A),如果i可以被j除尽,说明j个A可以通过复制粘贴得到i个A,复制粘贴次数为i / j。每个格子的意义:得到目前数量个A需要的最少操作次数递推公式:dp[i] = min(dp[i], dp[j] + i / j),其中i % j == 0初始化:1个A不需原创 2021-08-03 21:48:47 · 132 阅读 · 0 评论 -
经典动态规划:字符串编辑-(LC72)
题目:给定两个字符串,已知你可以删除、替换和插入任意字符串的任意字符,求最少编辑几步可以将两个字符串变成相同题解:我们可以对任意一个单词进行三种操作:插入一个字符;删除一个字符;替换一个字符。题目给定了两个单词,设为 A 和 B,这样我们就能够六种操作方法。但我们可以发现,如果我们有单词 A 和单词 B:对单词 A 删除一个字符和对单词 B 插入一个字符是等价的。例如当单词 A 为 doge,单词 B 为 dog 时,我们既可以删除单词 A 的最后一个字符 e,得到相同的原创 2021-08-03 21:24:35 · 568 阅读 · 0 评论