掘友等级
获得徽章 0
#每日一题# 两数相加。
链表相加:取链表节点的值:l1.value,l2.value.
新创建节点:new ListNode("0")
考虑进位的问题:addOne>=10?1:0
优化点:l1!==null?l1.val:0
#每日一题# 单词拆分:可以理解为完全背包问题。单词就是物品,字符串s就是背包。单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包。
1、确定dp数组以及下标的含义。
dp[i]:字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。
2、确定递推公式:
如果dp[j]为true,且[j,i]这个区间的子串出现在字典里。那么dp[i]一定为true。(j<i)
3、dp数组的初始化。
dp[i]的状态依靠dp[j]是否为true,那么dp[0]就是递推的根基。dp[0]一定要为true;否则递推下去后面就都是false了。
下标非0的dp[i]初始化为false,只要没有被覆盖说明都是不可拆分为一个或多个在字典中出现的单词。
4、确立遍历顺序。
如果求组合数就是外层for循环遍历物品,内层for循环遍历背包。
如果求排列数就是外层for循环遍历背包,内层for循环遍历物品。
#每日一题# 中心散法:两种情况 一种是回文子串长度为奇数(如aba,中心是b) 另一种回文子串长度为偶数(如abba,中心是b,b)
循环遍历字符串 对取到的每个值 都假设他可能成为最后的中心进行判断
#每日一题# 滑动窗口问题,给定一个字符串s,找出不含重复字符的最长字串的长度。
可以借用Set的方法,set.has(),set.delete(),set.add()来实现。设置两个指针。
#每日一题# DFS深度优先遍历:1、从头遍历矩阵,找到第一个符合的字符,开始深度优先遍历。
定义index代表word的索引,表示匹配了多少字符。
递归的出口为:i、j越界或者字符不匹配
匹配成功:index等于word.length-1,匹配成功则返回true;
为了同一个单元格内的字母不被重复利用,将该字符设置为“ “,当四个方向遍历完毕后,再恢复这个字符。
若一直匹配失败,则返回false;
#每日一题# 本题求子序列,很明显一个元素不能重复使用。所以需要startIndex。
同一父节点下的同层上使用过的元素就不能再使用了。
used是记录本层元素是否重复使用,新的一层used都会重新定义(清空),所以要知道used只负责本层!
注意在res.push时不要加return,因为要取树上的节点。
#每日一题#
排列问题需要一个used数组,标记已经选择的元素。
每层都是0开始搜索不是startIndex
#每日一题#
回溯算法中的分割回文串问题。
1、判断一个串是否是回文串。
2、切割问题,也可以抽象成一个树形结构。用for循环实现横向遍历。用递归实现深度遍历。切割线切割到字符串的结尾位置,说明找到了一个切割方法。
#每日一题# 分割等和子集问题,这道题目是要找是否可以将数组分割成两个子集,使得两个子集的元素和相等。那么只要找到集合里能够出现sum/2的子集总和,就算是可以分割成两个相同元素和子集了。题目描述中商品不可以重复放入。所以我们使用01背包。
dp[j]=Math.max(dp[j],dp[j-weight[i]]+value[i].
#每日一题# 使用动态规划法解决不同路径的问题,按照动规五部曲来分析。
1、dp[i][j]:表示从(0,0)出发到(i,j)有dp[i][j]条路径。
2、确定递推公式:只能从两个方向推导出来,即dp[i-1][j]和dp[i][j-1].
3、dp数组的初始化:dp[i][0]=0;dp[0][j]=0
4、递归顺序从左到右以此遍历即可
下一页