Re: [閒聊] 每日leetcode

作者: DJYOMIYAHINA (通通打死)   2024-08-07 00:29:32
這應該是前天的
在整數域上的binary search 持續苦手
不過這題是有點更難了
照著答案寫
==
應該沒半天就忘了
一生就這樣了
def rangeSum(self, nums: List[int], n: int, left: int, right: int) -> int:
# 找出 cnt以及sums of subarrays which summations are <= S
def cnt_sum_of_subs_less_than_or_equal_S(S):
count, total_sum, current_window_sum, running_sum = 0, 0, 0, 0
start = 0
for end, num in enumerate(nums):
running_sum += num * (end - start + 1)
current_window_sum += num
while current_window_sum > S:
running_sum -= current_window_sum
current_window_sum -= nums[start]
start += 1
count += end - start + 1
total_sum += running_sum
return count, total_sum
# 找出sum是前K小個的subarr
def SumofKSmallestSubarrays(K):
# Binary search, K is 1-index
l,r = 0, sum(nums)+1
while l<r:
mid = (l+r)//2
cnt, sum_of_arrays = cnt_sum_of_subs_less_than_or_equal_S(mid)
if cnt < K:
l=mid+1
else:
r=mid
cnt, sum_of_arrays = cnt_sum_of_subs_less_than_or_equal_S(l)
# binary seach找到的l只是: sum(sub)<=S的sub個數>=K裡面的最小的S
# 但有可能有很多個subs的sum == S
# 所以這個cnt可能不是真的最小K個的sum
# 所以要另外減掉 (cnt-K)*S
# 若 cnt == K 則代表剛好只有一個subarr的sum==S
return sum_of_arrays - l*(cnt-K)
m = 10**9+7
ans = SumofKSmallestSubarrays(right)-SumofKSmallestSubarrays(left-1)
return ans % m
作者: JIWP (JIWP)   2024-08-07 00:30:00
大師
作者: oin1104 (是oin的說)   2024-08-07 00:35:00
大師

Links booklink

Contact Us: admin [ a t ] ucptt.com