本文的选题依据来自 https://cspiration.com/leetcodeClassification 中的划分,下面的序号以 Leetcode 英文版为准
41.First Missing Positive
- 该题需要求丢失的最小正数
- 该题使用桶排序进行数据的组合,for 循环中使用的 while 循环是为了能够让元素对应到自己的位置上,所以在 while 循环中判断数组的数字有没有超过或小于数组长度,以{4,79,84,82}为例,只有第一个 4 在数组长度范围内,所以它在第一轮 for 之后被排到第四号位,其余数字均不动。第二个 for 循环是顺序查找,发现如果有数字不满足当前下标+1 的情况就返回,如果均满足则返回数组长度+1
42.Trapping Rain Water
- 上图中的绿色横线代表从左向右看的最大高度,红色横线代表从右向左看的最大高度,第一个 for 循环就是为了确定左向右数组的高度,以图为例,数组为[0,1,1,2,2,2,2,3,3,3,3,3];第二个 for 循环为了确定右向左数组的高度,以图为例,数组为[3,3,3,3,3,3,3,3,2,2,2,1],而水的高度是取两个数组中较小的那个数减去原本位置的高度,以从左向右看第一个存水位为例,min(1,3)=1,而原数组此处高度为 0,所以它存了高度为 1 的水量
43.Multiply Strings
- 该题主要是理解 p1 和 p2 代表的意思,以 12*34 为例,digits 长度为 4,下标从 0 到 3,第一轮 p1 在 2,p2 在 3,此时 sum=8+0=8,digits[2]=0,digits[3]=8;第二轮 p1 在 1,p2 在 2,此时 sum=2*3=6,digits[2]=6;第三轮 p1 在 1,p2 在 2,digits[1]=1,digits[2]=0;最后一轮,p1 在 0,p2 在 1,digits[1]=4,结束
44.Wildcard Matching
- 该题难点在于对*号的判断,因为它具有任意匹配的能力,所以在对 s 进行循环的过程中需要判断几点
- 当前字符是否和匹配字符相同或者匹配字符是不是问号,如果匹配上则双方都++
- 如果匹配位置是个*,则先记录它的位置,将 s 的位置赋给 match 代表匹配的长度,最后 p++,这是因为有可能后面有非*元素
- 如果 star!=-1 则意味着出现了*,那么 p 的位置自然是*+1,之后将 match++,因为*可以和任意字符匹配,然后将 match 赋给 s 代表 s 已经匹配的长度
- 第二个 while 是为了防止 s 循环结束后 p 中出现多个*的情况,因为*可以匹配任意字符,也包括空字符
- 最后判断 p 的长度是否和指针移动距离相同
45.Jump Game II
- 该题考察的是从起点到终点跳的最短次数,题目已经说明一定有从起点到终点的路径
- 主要维护了两个变量,一个是当前位置能够到达的最远地方(curMaxArea),一个是过去出发能够达到的最远地方(maxNext)
- 以[2,3,1,1,4]为例,从 2 出发能到达的最远为第一个 1 处,此时满足 i==curMaxArea,maxNext=2,所以 res=1,curMaxArea = maxNext = 2;移动一步到 3,此时 maxNext = 1+3 = 4,但是不满足 i==curMaxArea;移动一步到 1,此时满足 i==curMaxArea,maxNext=4,所以 res=2,curMaxArea = maxNext = 4;最后的 1 不移动,循环结束,res=2
- 这里的思想就是如果当前位置达到了之前能达到的最远距离,这时就能对 res++,而 curMaxArea 被重置为 maxNext 是为了应对 1(index)+3(jump) 这种情况,也就是说在当前位置没有达到之前能达到的最远距离之前就有出发点能够跳的更远,那么就对当前能够达到的距离进行更新
⭐46.Permutations
- 这个方法就是不断交换两个数字,交换之后注意还原,典型的回溯法
47.Permutations II
- 包含重复数字的排列问题,都是先排序,再去重
48.Rotate Image
- 先以对角线为轴反转得到转置矩阵,再以中间数轴旋转
49.Group Anagrams
- 先对字符串进行排序,之后使用 Map 进行判断即可
50.Pow(x, n)
- 主要是注意 res*=x 的操作,以 2.1^7 为例,i%2!=0,所以 res*=x=1*2.1=2.1,之后 x*=x,所以 i 可以除以 2 等于 3,此时依旧 i%2!=0,所以 res*x=2.1*4.41=9.261;之后 x*=x=19.4481,i=1,所以 i%2!=0,res*x=9.261*19.4481=180.1088541,最后 i=0,结束。也就是说 x*x 这个操作是为了让指数快速减小,而 res*x 则是为了在指数为奇数时完成数值更新