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,菜菜,我要像我家哥哥一样练习两年半
分类:
# 刷题、比赛与杂谈
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!