2022力扣杯个人赛——Python解(做出来的题)

LCP 61. 气温变化趋势

我的思路是生成两个记录变化趋势的数组,然后用动态规划来找两个数组的最长公共子串

class Solution:
	# 生成记录变化趋势的数组
    def outJudge(temperature) :
        res = []
        for i in range(len(temperature) - 1) :
            if temperature[i] == temperature[i + 1] :
                res.append(0) #平稳为0
            elif temperature[i] > temperature[i + 1] :
                res.append(-1) #降低为-1
            else :
                res.append(1) # 增高为1
        return res
    
    def solution (A, B) :
        res = -1
        dp = [[0] * (len(A) + 1) for _ in range(len(B) + 1)]
        for i in range(1, len(A) + 1) :
            for j in range(1, len(B) + 1) :
                if A[i - 1] == B[i - 1] :
                    dp[i][j] = dp[i - 1][j - 1] + 1
                res = max(dp[i][j], res)
        return res
        
    def temperatureTrend(self, temperatureA: List[int], temperatureB: List[int]) -> int:
        A =  Solution.outJudge(temperatureA)
        B = Solution.outJudge(temperatureB)
        return Solution.solution(A, B)

复盘在网上看到一个大佬写的更好的方法,用的是贪心策略
每次记录数组的变化状态,如果变化一直则将到当前位置的长度+1,否则置0,同时更新结果集

class Solution:
    def temperatureTrend(self, temperatureA: List[int], temperatureB: List[int]) -> int:
        res = 0
        cur = 0
        for i in range(len(temperatureA) - 1) :
            a = (temperatureA[i] > temperatureA[i + 1]) - (temperatureA[i] < temperatureA[i + 1])
            b = (temperatureB[i] > temperatureB[i + 1]) - (temperatureB[i] < temperatureB[i + 1])
            if a == b : 
                cur += 1
            else :
                cur = 0
            res = max(res, cur)
        return res

在这里插入图片描述

附上被吊打的图片,大佬为什么是大佬,因为总能在处理问题时想出优雅而又高效的解题策略
这里还有个知识点:Python在布尔运算加减法时,True视作1,False视作0,因此可以用布尔运算来判断连续两个数的单调关系

LCP 62. 交通枢纽

这题我的思路是运用图的可达矩阵表示,这样将题目给的二维数组转变为可达矩阵,然后判定那i行的所有列都是0,i行的所有行(除了第i行)都是1,即可判定第i个节点是交通枢纽,时间复杂度O(n^2)了

class Solution:
    def judge(arr, num) :
        f1, f2 = False, False
        for i in range(len(arr)) :
            if arr[num][i] != 0 :
                break
        else :
            f1 = True
        for i in range(len(arr)) :
            if arr[i][num] != 1 :
                if i == num :
                    continue
                else :
                    break
        else :
            f2 = True
        return f1 and f2
            
    def transportationHub(self, path: List[List[int]]) -> int:
        num = []
        for i in path :
            num.append(i[0])
            num.append(i[1])
        numset = set(num)
        arr = [[0] * (max(numset) + 1) for _ in range(max(numset) + 1)]
        for i in path :
            arr[i[0]][i[1]] = 1
        for i in numset :
            if Solution.judge(arr, i) :
                return i
        else :
            return -1

这里用了个集合来记录图中的每个节点,max(set)可判断最大值

我们再看看大佬是如何优雅的解决这个问题的,原来大佬是用两个数组来记录每个节点的进出个数,通过个数来判断是否为枢纽,领教了,删繁就简,O(n)

class Solution:
    def transportationHub(self, path: List[List[int]]) -> int:
        n = 0
        for i in path :
            n = max([n, i[0] + 1, i[1] + 1])
        pin, pout= [0] * n, [0] * n
        for i in path :
            pin[i[0]] += 1
            pout[i[1]] += 1
        for i in range(n) :
            if pin[i] == 0 and pout[i] == n - 1 :
                return i
        else : return -1

2/6,菜菜,我要像我家哥哥一样练习两年半

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值