LeetCode 每日一题 2025/5/19-2025/5/25
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 5/19 3024. 三角形类型
- 5/20 3355. 零数组变换 I
- 5/21 3356. 零数组变换 II
- 5/22 3362. 零数组变换 III
- 5/23 3068. 最大节点价值之和
- 5/24 2942. 查找包含给定字符的单词
- 5/25 2131. 连接两字母单词得到的最长回文串
5/19 3024. 三角形类型
三条边从小到大排序 判断
def triangleType(nums):""":type nums: List[int]:rtype: str"""nums.sort()if nums[0]+nums[1]<=nums[2]:return "none"if nums[0]==nums[2]:return "equilateral"elif nums[1]==nums[0] or nums[1]==nums[2]:return "isosceles"else:return "scalene"
5/20 3355. 零数组变换 I
将所有queries中的数都+1得到cur nums所有数不大于cur既满足
change[i]记录从左到右的cur在此处的变动
def isZeroArray(nums, queries):""":type nums: List[int]:type queries: List[List[int]]:rtype: bool"""change={}for v in queries:l,r=v[0],v[1]change[l]=change.get(l,0)+1change[r+1]=change.get(r+1,0)-1cur=0for i in range(len(nums)):if i in change:cur+=change[i]if cur<nums[i]:return Falsereturn True
5/21 3356. 零数组变换 II
依次进行操作
并从左往右判断nums当前位置是否可以归零
如果可以 则继续在nums往右
如果不可以 则需要继续操作queries往右
def minZeroArray(nums, queries):""":type nums: List[int]:type queries: List[List[int]]:rtype: int"""n=len(nums)change={}k=0cur=0for i in range(n):num=nums[i]cur += change.get(i,0)while k<len(queries) and cur<num:l,r,v=queries[k]change[l]=change.get(l,0)+vchange[r+1]=change.get(r+1,0)-vif l<=i<=r:cur+=vk+=1if cur<num:return -1return k
5/22 3362. 零数组变换 III
从左往右考虑nums 将queries根据起始点排序
对于nums[i] 优先选取nums[i]在query中并且右端点更靠后的
用最大堆存放待选query
def maxRemoval(nums, queries):""":type nums: List[int]:type queries: List[List[int]]:rtype: int"""import heapqqueries.sort(key=lambda x:x[0])h=[]change={}j=0cur=0for i,num in enumerate(nums):cur+=change.get(i,0)while j<len(queries) and queries[j][0]==i:heapq.heappush(h, -queries[j][1])j+=1while cur<num and h and -h[0]>=i:cur+=1v=-heapq.heappop(h)+1change[v] = change.get(v,0)-1if cur<num:return -1return len(h)
5/23 3068. 最大节点价值之和
根据异或的性质 如果异或偶数次则值不变
对于树上的任意两个节点 将联通他们的边都进行一次操作
那么除了开始和结束的点 中间节点都被异或两次 值不变
所以可以异或任意两个点的值
将所有点操作后增加的值从大到小排序
每次选择最大的两个值 如果大于零则可以操作
def maximumValueSum(nums, k, edges):""":type nums: List[int]:type k: int:type edges: List[List[int]]:rtype: int"""ans=sum(nums)diff = [(x^k)-x for x in nums]diff.sort(reverse=True)i=0while i<len(nums)-1 and diff[i]+diff[i+1]>0:ans += diff[i]+diff[i+1]i+=2return ans
5/24 2942. 查找包含给定字符的单词
依次判断
def findWordsContaining(words, x):""":type words: List[str]:type x: str:rtype: List[int]"""ans=[]for i,w in enumerate(words):if x in w:ans.append(i)return ans
5/25 2131. 连接两字母单词得到的最长回文串
统计单词出现次数
如果反转后一致则判断是否是奇数个 奇数个可以由中心单词
def longestPalindrome(words):""":type words: List[str]:rtype: int"""from collections import Counter fre=Counter(words)mid=0ans=0for w,cnt in fre.items():rev = w[1]+w[0]if w==rev:if cnt%2==1:mid=1ans+=2*(cnt//2*2)elif w>rev:ans+=4*min(fre[w],fre[rev])return ans+2 if mid else ans