LeetCode 每日一题 2025/10/13-2025/10/19
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 10/13 2273. 移除字母异位词后的结果数组
- 10/14 3349. 检测相邻递增子数组 I
- 10/15 3350. 检测相邻递增子数组 II
- 10/16 2598. 执行操作后的最大 MEX
- 10/17 3003. 执行操作后的最大分割数量
- 10/18 3397. 执行操作后不同元素的最大数量
- 10/19
10/13 2273. 移除字母异位词后的结果数组
cur记录之前字母 判断其与当前的字母是否是异位词
def removeAnagrams(words):""":type words: List[str]:rtype: List[str]"""ans=[]def check(a,b):return sorted(a)!=sorted(b)for w in words:if len(ans)==0:ans.append(w)elif check(ans[-1],w):ans.append(w)return ans
10/14 3349. 检测相邻递增子数组 I
只要确定开始位置a判定 a~a+k-1 a+k~a+2*k-1是否递增即可
如果前一个数组中x,x+1 非严格递增
那么下一次a直接从x+1开始
def hasIncreasingSubarrays(nums, k):""":type nums: List[int]:type k: int:rtype: bool"""if k==1:return Truen=len(nums)a=0while a<=n-2*k:tag=Trueprint(a,nums[a:a+k+k])for i in range(a+1,a+k):if nums[i-1]>=nums[i]:tag=Falsea=ibreakif not tag:continuefor i in range(a+k+1,a+2*k):if nums[i-1]>=nums[i]:tag=Falsea+=1breakif not tag:continueelse:return Truereturn False
10/15 3350. 检测相邻递增子数组 II
遍历
记录当前位置严格递增的子数组长度cur
以及上一个子数组长度pre
满足要求的子数组可以为min(pre,cur) 或者cur//2
def maxIncreasingSubarrays(nums):""":type nums: List[int]:rtype: int"""n=len(nums)cur,pre,ans=1,0,0for i in range(1,n):if nums[i]>nums[i-1]:cur+=1else:pre,cur=cur,1ans=max(ans,min(cur,pre),cur//2)return ans
10/16 2598. 执行操作后的最大 MEX
所有数根据value取余数分组
余数相同的两个数可以经过若干次变化得到
统计每种余数个数 最小个数x
从小到大如果余数v个数为x 那么在下一轮就无法获取
MEX=x*value+v
def findSmallestInteger(nums, value):""":type nums: List[int]:type value: int:rtype: int"""m=[0]*valuefor num in nums:v= num%valuem[v]+=1x=min(m)for v in range(value):if m[v]==x:return x*value+v
10/17 3003. 执行操作后的最大分割数量
https://leetcode.cn/problems/maximize-the-number-of-partitions-after-operations/solutions/2595072/ji-yi-hua-sou-suo-jian-ji-xie-fa-pythonj-6g5z/?envType=daily-question&envId=2025-10-17
def maxPartitionsAfterOperations(s, k):""":type s: str:type k: int:rtype: int"""mem={}def dfs(i,mask,changed):if (i,mask,changed) in mem:return mem[(i,mask,changed)]if i==len(s):return 1bit=1<<(ord(s[i])-ord('a'))newmask=mask|bitif newmask.bit_count()>k:ans=dfs(i+1,bit,changed)+1else:ans=dfs(i+1,newmask,changed)if changed:mem[(i,mask,changed)]=ansreturn ansfor j in range(26):newmask=mask|(1<<j)if newmask.bit_count()>k:ans=max(ans,dfs(i+1,1<<j,True)+1)else:ans=max(ans,dfs(i+1,newmask,True))mem[(i,mask,changed)]=ansreturn ansreturn dfs(0,0,False)
10/18 3397. 执行操作后不同元素的最大数量
从小到大排序
数组操作后取值范围为 minv-k,maxv+k
所有数都尽可能小
pre记录之前最小值 当前值最小可以为num-k最大值为num+k
但需要比之前的pre大一点
def maxDistinctElements(nums, k):""":type nums: List[int]:type k: int:rtype: int"""nums.sort()ans=0pre=float('-inf')for num in nums:cur=min(max(num-k,pre+1),num+k)if cur>pre:ans+=1pre=curreturn ans
10/19