Day46力扣打卡

最近一直在做以前的题,刷题量都没有怎么增长,感觉自己算法一直不太行,但也只能菜就多练了。

打卡记录

在这里插入图片描述


由子序列构造的最长回文串的长度(区间DP)

链接

第二次刷这道题,相比上回思路来的很快,但是对 if i < len(word1) <= j 的限制条件,依旧不是很会设立。

class Solution:
    def longestPalindrome(self, word1: str, word2: str) -> int:
        s = word1 + word2
        n, ans = len(s), 0
        f = [[0] * n for _ in range(n)]

        for i in range(n - 1, -1, -1):
            f[i][i] = 1
            for j in range(i + 1, n):
                if s[i] == s[j]:
                    f[i][j] = f[i + 1][j - 1] + 2
                    if i < len(word1) <= j:
                        ans = max(ans, f[i][j])
                else:
                    f[i][j] = max(f[i][j - 1], f[i + 1][j])
        return ans  

阈值距离内邻居最少的城市(Floyd)

关于 Floyd 的最外层为 k k k 的解释:最外层的 k k k 是枚举位于起点和终点中的跳板,贪心的正确性必须得到保证,而这个保证在于,再求 f [ i ] [ j ] f[i][j] f[i][j] 时, f [ i ] [ k ] f[i][k] f[i][k] f [ k ] [ j ] f[k][j] f[k][j] 若可达(一般来说把不可达设置为无穷大),必须为最优值(即最短距离)。

class Solution:
    def findTheCity(self, n: int, edges: List[List[int]], distanceThreshold: int) -> int:
        g = [[0x3f3f3f3f] * (n) for _ in range(n)]
        for x, y, c in edges:
            g[x][y] = g[y][x] = c

        for k in range(n):
            for i in range(n):
                for j in range(n):
                    g[i][j] = min(g[i][j], g[i][k] + g[k][j])
        
        ans = 0
        min_cnt = inf
        for i in range(n):
            cnt = 0
            for j in range(n):
                if j != i and g[i][j] <= distanceThreshold:
                    cnt += 1
            if cnt <= min_cnt:
                min_cnt = cnt
                ans = i
        return ans
  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值