复习打卡全面汇总二
连续复习打卡第三十一天
<<算法刷题打卡第31天:预测赢家—递归>>
遇到的问题:
-
递归----计算先手最大分数: 递归公式不好想,没想到,想偏了 需要复习!!
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
-
递归----计算先手最大超过分数: 不太好想,这个写法和官方的还不太一样,但是貌似能起到类似的作用,不太好想通,果然递归还是难写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天:预测赢家—动态规划>>
遇到的问题:
-
动态规划----二维数组: 乖乖看视频学习去了,还是再温习温习吧,都忘记了…没彻底掌握。 需要复习!!
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
-
动态规划----一维数组: 同上。需要复习!!
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天:香槟塔>>
遇到的问题:
- 模拟: 无
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天:有效的井字游戏>>
遇到的问题:
- 分类讨论: 一点不想讲话,直接逻辑拉下来了…
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】>>
遇到的问题:
-
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
-
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算法完整版>>
遇到的问题:
- 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天:字符串中不同整数的数目>>
遇到的问题:
- 快慢指针: 无
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算法>>
遇到的问题:
- 快慢指针: 实现很简单,思路也简单,速度不错的一个字符串搜索算法,最好掌握,就是通过坏字符规则进行的,正向查找,判定主串与当前模式串匹配的最后一个字符的下一个字符是否包含在模式串中,在的话就跳跃到最右边出现的一个,否则直接跳跃整个模式串长度。 需要复习!!
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