LeetCode部分题解

链表:

2 正常遍历:正常进位计算,只不过考虑四种情况:都空、都不空、一个空,并且标记进位值;            

19 ·正常遍历:遍历链表大小,找到正序的位置,进而将其删除

 ·快慢指针:一次扫描,快慢指针之间的距离刚好为目标值,这样当快指针到达末尾的时候,慢指针所在位置的元素即为要删除的。

滑动窗口:

3 快慢指针:就像一个滑动窗口一样,如果当前检测位等于前面字符串里面的元素的话,将慢指针指向相同元素的后一位,比较最大长度;

每日

118:杨辉三角,当前位i,j的值由上一行的i-1,j和i-1,j-1的值相加决定,并且每一行的第一位和最后一位都是1,公式计算即可(唤醒对二维数组的应用)

204:任何一个合数可以看做几个合数之和,创建一个等长度的标记数组,从2进行检测,如果当前位(2)是质数,那么他的2倍、3倍的数肯定不是质数,进行标记。

数组:

26 ·正常遍历:对于每一个元素而言,都将其与他后面的元素进行比较,取最后一次出现的该元素。    

   ·双指针:首先第一个元素肯定要,快指针从1开始,慢指针从0开始,如果两个位置上的元素不相等,则将其放到慢指针后面一位。   

27 双指针:快指针为目标元素,慢指针从0开始,如果二者不相等,那么就将其放入数组的慢指针位置上,慢指针后移;

80:快慢指针:两个指针之间相差2个位进行遍历,如若当前两个位相等,那么则需要将当前位删除,我使用了一个笨办法,就是让后面的逐个前移一位,从而继续进行判断,也就是在这一步使得我的代码运行时间变慢。

189:第一种方法:最容易想的就是开创一个新数组,然后进行搬运,进行相应位的挪动即可;

第二种方法:每次往后移动一步,然后设一个k步的循环(主要是如果直接往后移动k步的话,或造成一直是两个在动的情况)

String:

28:·正常遍历(有点像滑动窗口):对于给定的字符串的每一位都从他开始往后遍历目标字符串个长度,满足则直接返回,不满足则进行下一位的遍历。

    ·BMP:先求目标串的最大相同前后缀长度数组,而这个数组是当当前位不匹配时,往前后退几步的关键:若不匹配,则从当前位的前一位的next值开始重新遍历。

D:\火狐\1599638354-SppDsh-KMP精讲2.gif

动态规划:

每日62:要走到当前格子,有两种方法:从上面的格子往下走一步、或者从左边的格子往右走一步,所以符合动态规划的思想,dp[i][j]=dp[i-1][j]+dp[i][j-1]。

63:与62思想相同,但是很折磨人,当遇到障碍的时候,将其置为0,即可(sm边界条件)

70:一维的动态规划,到达当前阶梯有两种办法:前一个走一步、或者前两个走两步dp[i]=dp[i-1]+dp[i-2]。

279:同样也是一维的动态规划,其实我是想到了思路的,就是当前位的最优解是前面的某一位+1而成,就是在实现的时候对于那些平方根的处理没仔细想,其实也就先枚举出来所有的可以一步平方的数,然后在对其进行循环完善dp数组。

Dp[i]=min(dp[i],dp[i-sqrt[j]]+1).

64:二维的动态规划,很简单,这次完全是自己想出来的;dp[i][j]=min(上,左)+grid;

72:二维,其实刚开始自己想的时候也很简单,dp[i][j]代表的就是word1的前i个和word2的前j个的最小实现,而每往后走一步只需要看三个位置进行动态规划即可,也就是:dp[i][j]=min(dp[i-1][j-1,dp[i-1][j],dp[i][j-1]),只是初始的第一行的初始化我没有想出来,也就是dp[0][i]=i;

97:比较难想一点的二维,dp[i][j]代表的就是s1的前i个和s2的前j个是否可以拼成s3的前i+j个,而当前dp位的判断取决于s1或者s2当前位是否等于s3的当前位,只要是满足一个true即为true,f(i,j)=[f(i−1,j)and s1(i−1)=s3(p)] or [f(i,j−1)and s2(j−1)=s3(p)]

起初我是直接想到了双指针一位一位的排除,但其实示例就直接反驳了这个思想。

贪心:

55:只要求出当前可以到达的最远点,将其与最后一位进行比较,即可看出是否可以到达。重点:判断当前位是否可以到达,进而来更新最远到达距离。

122:只遍历一遍,只要当前位-前一位的值为正的那么就将其加入到result中,因为可以多次买卖,所以贪心求得就是当前只要能有收益就卖。

每日135:二次贪心:先从头遍历一遍,使其满足r[i]>r[i-1]的情况,对于每一位求得一个糖果值,进而从后往前遍历一遍,使其满足r[i]>r[i+1]的情况,进而求二者在每一位的最大值。

每日860:找零钱问题;模拟+贪心;对于当前的钱数,判断零钱库中是否满足,无非就那几种情况;

哈希:

    每日49:哈希表的第一次应用:将当前检索的string排序作为一个key在哈希表中查询调用getOrDefault() 进行list的更新;并且学习到了ArrayList和List的区别。

回溯:

①画出递归树,找到状态变量(回溯函数的参数),这一步非常重要※

②根据题意,确立结束条件

③找准选择列表(与函数参数相关),与第一步紧密关联※

④判断是否需要剪枝

⑤作出选择,递归调用,进入下一层

⑥撤销选择

78:回溯最简单的入门模板题:对于本题而言,每一步都是从当前位+1重新开始back添加,所以确定了状态变量,并且找准递归函数的参数进行添加,将本题作为一个简单的模板来使用。

90:作为78题的进阶版,在78题的基础上增添了剪枝,首先画出递归树是很重要的,在这颗树上找到相应的规律,并且在确定了递归函数之后进而确定剪枝条件,对于本题而言的剪枝就是:在每一步的递归里面加入当前位是否等于上一位的判断,如果等于则说明,本次结果已经重复了,不必在实现。

77:这个题其实和上面的一个意思,换了一种问法和剪枝,同样的画出递归树,找到状态变量:当前位+1,剪枝:判断是否大小到k。惭愧,看了讲解才做出来。

39:组合类型;这道题需要换一个逆向的思维,对于目标值而言,每一次都减去相应的给定值,这样在下一次递归的时候目标值都会发生变化,而剪枝条件就是:target=0或者<0,并且在剪枝之后退回原来的状态;对于消除重复的情况:在每层的递归开始时,只进行当前位后面的目标的减,即可消除重复结果;   画出递归树很重要!!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值