[ 周赛总结 ] 第 186 场力扣周赛

题目:

总结:

  1. 递归写的不熟练,第一题写的太丑了
  2. 思维僵化了,没有从反方向考虑,比如第二题

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个数,让滑动窗口从最右边滑到最左边,迭代一个最大点数
  • 需要改进的地方:
  1. 开始一直在思考只拿左边、只拿右边、左右同时拿三种情况,递归没写出来。
  2. 递归思路没有反向思考K的值,K递减到1即为出口
  3. 试试其他思路,比如反向考虑:求滑动窗口内的最小值(相对的窗口外的和就是要求的最大点数);求数组连续最小和;等等
  • 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. 找规律,只要在对角线上,那么它的横纵坐标和是相等的,比如示例1

    (0,0),(0,1),(0,2)
    (1,0),(1,1),(1,2)
    (2,0),(2,1),(2,2)
  2. 遍历nums,把横纵坐标和相同的元素放在一起作为值,横纵坐标的和作为键。
  3. 排序字典,输出答案。
原文地址:https://www.cnblogs.com/remly/p/12790885.html