第241题到309题,终于终于把所有的中等难度都算是二刷了。今天再总结一下,明天可以进入难题了。
486. Predict the Winner:用backtracking做了一遍,果然隔代考虑容易一些,我本来用play1,player2这样子来考虑,一会就绕晕头了,用dp再做一遍,这个递推公式是关键:dp[i][j] = max(dp[i][j], sum(nums[i:j+1]) - dp[i][j-1], sum(nums[i:j+1]) - dp[i+1][j])
494. Target Sum:如果用简单的backtracking就会TLE, 用记忆化搜索可以AC。这道题可以非常巧妙的转化为背包问题,比如对于a,b,c, sum = +a+b+c, 假设target = -a-b+c, 那么sum+target = 2c,也就是要找到一些元素,能够正好放入(sum+target)/2的背包里,问有多少种放法,不过这道题很tricky,我还不太适应一维背包,所有利用二维背包来做,用二维背包的时候因为这里面有0,所以在初始化的时候很要注意0的问题。
505. The Maze II: 这道题就是要求图上两点间的最短路径,但是求的时候不是那么直接,要记录当前点的最短路径,用heap来存所有可以访问的点,用hash来存起点道此访问点的距离
523. Continuous Subarray Sum: 对于mod负数还是不太熟悉
525. Contiguous Array:也是利用前缀和+hash,不过有点做累了。所以这题思路没想太清晰就去看答案了,应该能够完整写出来的。
553. Optimal Division:这题虽然有数学解法,不过最好还是用backtracking做一遍,用backtracking的时候要同时记录最大值和最小值
555. Split Concatenated Strings:umm,这题的描述让人很不想做。
562. Longest Line of Consecutive One in Matrix: 利用多维dp,code会清爽很多
609. Find Duplicate File in System: 这题题目本身不难,follow up涉及处理海量数据的问题,要多看看
621. Task Scheduler: 一道greedy的题目,利用heap的排序性质,先把最大的频率的值先访问,然后依次填满两个最大频率之间的空
625. Minimum Factorization: 用greedy的想法还是比较容易做出来的
634. Find the Derangement of An Array: 其实算一道数学题,主要要记住这个递推公式:dp[i] = (i-1)*(dp[i-2]+dp[i-1])
636. Exclusive Time of Functions: 用stack来做,一个一个朝里面加,然后用stack[-1]的值来累积哪一项任务的时长。
638. Shopping Offers: 这道题就是一道dfs,不要被它的样子所迷惑了,dp很难解的
649. Dota2 Senate: 用一个deque,pop出来一个元素后,考虑要不要加回去。
652. Find Duplicate Subtrees:当时做的时候有点懵。。。不过其实也就是把每一个node表示成一个preorder的string,然后比较一下就好了,没遇到过这种题目,第一次的话,还是有点思路没绕开