算法刷题复习计划二

复习打卡全面汇总二


连续复习打卡第三十一天

<<算法刷题打卡第31天:预测赢家—递归>>

遇到的问题:

  1. 递归----计算先手最大分数: 递归公式不好想,没想到,想偏了 需要复习!!

    class Solution:
        def PredictTheWinner(self, nums: List[int]) -> bool:
            def recursion(l, r):
                if r - l < 2:
                    l_score, r_score = nums[l], nums[r]
                else:
                    mid = recursion(l+1, r-1)
                    l_score = nums[l] + min(recursion(l+2, r), mid)
                    r_score = nums[r] + min(mid, recursion(l, r-2))
                return max(l_score, r_score)
            res = recursion(0, len(nums) - 1)
            return True if res >= sum(nums) - res else False
    
  2. 递归----计算先手最大超过分数: 不太好想,这个写法和官方的还不太一样,但是貌似能起到类似的作用,不太好想通,果然递归还是难写T^T。需要复习!!

    class Solution:
        def PredictTheWinner(self, nums: List[int]) -> bool:
            def recursion(l, r):
                if l == r:
                    return nums[l]
                l_diff = nums[l] - recursion(l+1, r)
                r_diff = nums[r] - recursion(l, r-1)
                return max(l_diff, r_diff)
            return recursion(0, len(nums)-1) >= 0
    

更新时间:2023-01-10


连续复习打卡第三十二天

<<算法刷题打卡第32天:预测赢家—动态规划>>

遇到的问题:

  1. 动态规划----二维数组: 乖乖看视频学习去了,还是再温习温习吧,都忘记了…没彻底掌握。 需要复习!!

    class Solution:
        def PredictTheWinner(self, nums: List[int]) -> bool:
            length = len(nums)
            dp = [[nums[i] if i == j else 0 for i in range(length)] for j in range(length)]
            for i in range(length-2, -1, -1):
                for j in range(i+1, length):
                    dp[i][j] = max(nums[i] - dp[i+1][j], nums[j] - dp[i][j-1])
            return dp[0][length-1] >= 0
    
  2. 动态规划----一维数组: 同上。需要复习!!

    class Solution:
        def PredictTheWinner(self, nums: List[int]) -> bool:
            length, dp = len(nums), nums.copy()
            for i in range(length-2, -1, -1):
                for j in range(i+1, length):
                    dp[j] = max(nums[i] - dp[j], nums[j] - dp[j-1])
            return dp[-1] >= 0
    

更新时间:2023-01-11


连续复习打卡第三十三天

<<算法刷题打卡第33天:香槟塔>>

遇到的问题:

  1. 模拟:
    class Solution:
        def champagneTower(self, poured: int, query_row: int, query_glass: int) -> float:
            up = [poured]
            for i in range(query_row):
                down = [0] * (i + 2)
                for j in range(i+1):
                    if up[j] > 1:
                        more = (up[j] - 1) / 2
                        down[j] += more
                        down[j+1] += more
                up = down
            return min(1, up[query_glass])
    

更新时间:2023-01-12


连续复习打卡第三十四天

<<算法刷题打卡第34天:有效的井字游戏>>

遇到的问题:

  1. 分类讨论: 一点不想讲话,直接逻辑拉下来了…
    class Solution:
        def validTicTacToe(self, board: List[str]) -> bool:
            def win(string):
                for i in range(3):
                    for j in range(3):
                        if board[i][j] != string:
                            break
                    else:
                        return True
                    for j in range(3):
                        if board[j][i] != string:
                            break
                    else:
                        return True
                for i in range(3):
                    if board[i][i] != string:
                        break
                else:
                    return True
                for i in range(3):
                    if board[i][2-i] != string:
                        break
                else:
                    return True  
                return False        
                
            x, o = 0, 0
            for i in range(3):
                for j in range(3):
                    if board[i][j] == 'X':
                        x += 1
                    elif board[i][j] == 'O':
                        o += 1
            if x - o == 1:
                if not win('O'):
                    return True
            elif x - o == 0:
                if not win('X'):
                    return True
            return False
    

更新时间:2023-01-13


连续复习打卡第三十五天

<<算法刷题打卡第35天:找出字符串中第一个匹配项的下标【BF/RK/BM】>>

遇到的问题:

  1. BF算法:

    class Solution:
        def strStr(self, haystack: str, needle: str) -> int:
            length = len(needle)
            for i in range(len(haystack)):
                if haystack[i:i+length] == needle:
                    return i
            return -1
    
  2. RK算法:

    class Solution:
        def strStr(self, haystack: str, needle: str) -> int:
            length = len(needle)
            needle_num = sum(ord(i) for i in needle)
            haystack_num = sum(ord(i) for i in haystack[:length]) 
            for i in range(len(haystack) - length + 1):
                if i != 0:
                    haystack_num = haystack_num - ord(haystack[i-1]) + ord(haystack[i-1+length])
                if needle_num == haystack_num:
                    if needle == haystack[i:i+length]:
                        return i
            return -1
    

更新时间:2023-01-14


连续复习打卡第三十六天

<<算法刷题打卡第36天:找出字符串中第一个匹配项的下标—BM算法完整版>>

遇到的问题:

  1. BM算法: 感觉难度有点大,列为多次巩固内容。需要复习!!
    class Solution:
        def strStr(self, haystack: str, needle: str) -> int:
            def bad_char(t, t_len):
                bc_dict = dict()
                for i in range(t_len):
                    bc_dict[t[i]] = i
                return bc_dict
            
            def good_suffix(t, t_len):
                suffix = [-1] * t_len
                prefix = [False] * t_len
                for i in range(t_len-1):
                    start = i
                    suffix_length = 0
                    while start >= 0 and t[start] == t[t_len-1-suffix_length]:
                        suffix_length += 1
                        suffix[suffix_length] = start
                        start -= 1
                    if start < 0:
                        prefix[suffix_length] = True
                return suffix, prefix
                
            def move(i, t_len, suffix, prefix):
                suffix_length = t_len - 1 - i
                if suffix[suffix_length] != -1:
                    return i + 1 - suffix[suffix_length]
                for k in range(suffix_length-1, 0, -1):
                    if prefix[k]:
                        return t_len - k
                return t_len
    
            def bm(s, s_len, t, t_len):
                bc_dict = bad_char(t, t_len)
                suffix, prefix = good_suffix(t, t_len)
                now = 0
                while now <= s_len - t_len:
                    i = t_len - 1
                    while i >= 0 and s[now + i] == t[i]:
                        i -= 1
                    if i < 0:
                        return now
                    bc_move = i - bc_dict.get(s[now+i], -1)
                    gs_move = 0
                    if t_len - 1 != i:
                        gs_move = move(i, t_len, suffix, prefix)
                    now += max(bc_move, gs_move)
                return -1
            return bm(haystack, len(haystack), needle, len(needle))
    

更新时间:2023-01-30


连续复习打卡第三十七天

<<算法刷题打卡第37天:字符串中不同整数的数目>>

遇到的问题:

  1. 快慢指针:
    class Solution:
        def numDifferentIntegers(self, word: str) -> int:
            nums = set()
            l, r = 0, 1
            while r < len(word):
                if not word[l].isdigit() and word[r].isdigit():
                    l = r
                elif word[l].isdigit() and not word[r].isdigit():
                    nums.add(int(word[l:r]))
                    l = r
                r += 1
            if word[l].isdigit() and word[r-1].isdigit():
                nums.add(int(word[l:r]))
            return len(nums)
    

更新时间:2023-01-31


连续复习打卡第三十八天

<<算法刷题打卡第38天:找出字符串中第一个匹配项的下标—Sunday算法>>

遇到的问题:

  1. 快慢指针: 实现很简单,思路也简单,速度不错的一个字符串搜索算法,最好掌握,就是通过坏字符规则进行的,正向查找,判定主串与当前模式串匹配的最后一个字符的下一个字符是否包含在模式串中,在的话就跳跃到最右边出现的一个,否则直接跳跃整个模式串长度。 需要复习!!
    class Solution:
        def numDifferentIntegers(self, word: str) -> int:
            nums = set()
            l, r = 0, 1
            while r < len(word):
                if not word[l].isdigit() and word[r].isdigit():
                    l = r
                elif word[l].isdigit() and not word[r].isdigit():
                    nums.add(int(word[l:r]))
                    l = r
                r += 1
            if word[l].isdigit() and word[r-1].isdigit():
                nums.add(int(word[l:r]))
            return len(nums)
    

更新时间:2023-02-01


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏秃然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值