题目:
总结:
- 递归写的不熟练,第一题写的太丑了
- 思维僵化了,没有从反方向考虑,比如第二题
A: 分割字符串的最大得分
- 算法:这道题蛮简单的,递归穷举所有可能的情况即可
- 需要改进的地方:递归写的不够优雅,需要改进
-
# 我的代码:
class Solution: def __init__(self): self.ret = -99 def maxScore(self, s: str) -> int: def resolve(i): if i>=len(s): return 0 left = s[:i] right=s[i:] self.ret = max(self.ret , left.count('0')+right.count('1')) resolve(i+1) return 1 resolve(1) return self.ret - 改进:
class Solution: def maxScore(self, s: str) -> int: def resolve(i,ans): if i>=len(s): return ans ans = max(ans,s[:i].count('0')+s[i:].count('1')) return resolve(i+1,ans) ret = resolve(1,-99) return ret
B:可获得的最大点数
- 算法:用滑动窗口的思路,保持窗口外有K个数,让滑动窗口从最右边滑到最左边,迭代一个最大点数
- 需要改进的地方:
- 开始一直在思考只拿左边、只拿右边、左右同时拿三种情况,递归没写出来。
- 递归思路没有反向思考K的值,K递减到1即为出口
- 试试其他思路,比如反向考虑:求滑动窗口内的最小值(相对的窗口外的和就是要求的最大点数);求数组连续最小和;等等
-
class Solution: def maxScore(self, nums: List[int], k: int) -> int: left=k right=0 ans=-1 left_total = sum(nums[0:left]) right_total =0 while left>=0: total = left_total+right_total ans = max(ans,total) right+=1 left-=1 left_total-=nums[left] right_total+=nums[len(nums)-right] return ans
C:对角线遍历 II
- 算法:哪个鬼才想到的。。。
-
找规律,只要在对角线上,那么它的横纵坐标和是相等的,比如示例1
(0,0),(0,1),(0,2)(1,0),(1,1),(1,2)(2,0),(2,1),(2,2) - 遍历nums,把横纵坐标和相同的元素放在一起作为值,横纵坐标的和作为键。
- 排序字典,输出答案。