链接: 6176. 出现最频繁的偶数元素
class Solution:
def mostFrequentEven(self, nums: List[int]) -> int:
cnt = Counter(n for n in nums if (n&1) == 0)
ans = 10**6
for k,v in cnt.items():
if v > cnt[ans]:
ans = k
elif v == cnt[ans]:
ans = min(ans,k)
if ans == 10**6:
ans = -1
return ans
链接: 6177. 子字符串的最优划分
定级Medium。
class Solution:
def partitionString(self, s: str) -> int:
n = len(s)
ans = 1
cnt = Counter()
cnt[s[0]] = 1
for r in range(1,n):
# print(s[r],cnt)
if s[r] in cnt:
ans += 1
cnt = Counter(s[r:r+1])
else:
cnt[s[r]] += 1
return ans
链接: 6178. 将区间分为最少组数
定级Medium。
class Solution:
def minGroups(self, intervals: List[List[int]]) -> int:
n = len(intervals)
intervals.sort(key=lambda x :x[0])
h = []
for l,r in intervals:
if h and h[0]<l:
heapq.heapreplace(h,r)
else:
heapq.heappush(h,r)
return len(h)
链接: 6206. 最长递增子序列 II
定级Hard。
class IntervalTree:
def __init__(self, size,nums=None):
self.size = size
self.nums = nums
self.interval_tree = [0]*(size*4)
def update_point(self,p,l,r,index,val):
if index < l or r < index:
return
interval_tree = self.interval_tree
interval_tree[p] =max(interval_tree[p],val)
if l == r:
return
mid = (l+r)//2
if index <= mid:
self.update_point(p*2,l,mid,index,val)
else:
self.update_point(p*2+1,mid+1,r,index,val)
def query(self,p,l,r,x,y):
"""
查找x,y区间的最大值 """
if y < l or r < x:
return 0
if x<=l and r<=y:
return self.interval_tree[p]
mid = (l+r)//2
s = 0
if x <= mid:
s = max(s,self.query(p*2,l,mid,x,y))
if mid < y:
s = max(s,self.query(p*2+1,mid+1,r,x,y))
return s
class Solution:
def lengthOfLIS(self, nums: List[int], k: int) -> int:
n = len(nums)
mx = max(nums)
tree = IntervalTree(mx)
ans = 0
for i in range(n):
v = nums[i]
l = max(0,v-k)
r = max(0,v-1)
ret = tree.query(1,1,mx,l,r)+1
tree.update_point(1,1,mx,v,ret)
ans = max(ans,ret)
return ans