dùng đc segment tree, mới tuần trước làm virtual thấybài Q4 này chính ra tier medium-hard thôi bác nhỉ, chắc rating bài này cỡ 1k9Q4 cũng giống bài này nha ae![]()
Maximum Balanced Subsequence Sum - LeetCode
Can you solve this real interview question? Maximum Balanced Subsequence Sum - You are given a 0-indexed integer array nums. A subsequence of nums having length k and consisting of indices i0 < i1 < ... < ik-1 is balanced if the following holds: * nums[ij] - nums[ij-1] >= ij - ij-1, for every...leetcode.comdùng đc segment tree, mới tuần trước làm virtual thấy

Q4 biết thì dễ :v không biết thì khó bác ơibài Q4 này chính ra tier medium-hard thôi bác nhỉ, chắc rating bài này cỡ 1k9![]()
Ừ đúng rồi, ko cần nghĩ phức tạp quá thì sẽ ra thôi. Mới sửa lại thì dùng 1 sorted list là ăn luônbài Q4 này chính ra tier medium-hard thôi bác nhỉ, chắc rating bài này cỡ 1k9![]()
tự dưng set ans = 0 thay vì ans = 1Em xin code sorted list với ạỪ đúng rồi, ko cần nghĩ phức tạp quá thì sẽ ra thôi. Mới sửa lại thì dùng 1 sorted list là ăn luôn
hint prefix sum + sorted list ngheEm xin code sorted list với ạ

Đưa về prefix sum xong tìm các tổng > 0 là dc. Dùng bất cứ gì có thể range query trong n log n là ăn roàiQ4 cũng giống bài này nha ae![]()
Maximum Balanced Subsequence Sum - LeetCode
Can you solve this real interview question? Maximum Balanced Subsequence Sum - You are given a 0-indexed integer array nums. A subsequence of nums having length k and consisting of indices i0 < i1 < ... < ik-1 is balanced if the following holds: * nums[ij] - nums[ij-1] >= ij - ij-1, for every...leetcode.comdùng đc segment tree, mới tuần trước làm virtual thấy
class Solution:
def countMajoritySubarrays(self, nums: List[int], target: int) -> int:
answer = 0
current_diff = 0
diff_freq = {0: 1}
count_start_pos = 0
for num in nums:
if num == target:
count_start_pos += diff_freq.get(current_diff,0)
current_diff += 1
else:
current_diff -= 1
count_start_pos -= diff_freq.get(current_diff,0)
answer += count_start_pos
diff_freq[current_diff] = diff_freq.get(current_diff,0) + 1
return answer
đoạn count_start_pos ý tưởng là sao vậy thímPython:class Solution: def countMajoritySubarrays(self, nums: List[int], target: int) -> int: answer = 0 current_diff = 0 diff_freq = {0: 1} count_start_pos = 0 for num in nums: if num == target: count_start_pos += diff_freq.get(current_diff,0) current_diff += 1 else: current_diff -= 1 count_start_pos -= diff_freq.get(current_diff,0) answer += count_start_pos diff_freq[current_diff] = diff_freq.get(current_diff,0) + 1 return answer

class Solution:
def countMajoritySubarrays(self, nums: List[int], target: int) -> int:
res = 0
n = len(nums)
prefix = [0]*(n+1)
for i in range(n):
num = nums[i]
if num == target:
prefix[i+1]=prefix[i]+1
else:
prefix[i+1]=prefix[i]-1
s = SortedList()
res = 0
for num in prefix:
l = s.bisect_left(num)
res+= l
s.add(num)
return res
Fen đưa đoạn tính prefix sum rồi add vô sl vô 1 loop là được, dùng 1 biến count là đủ rồiPython:class Solution: def countMajoritySubarrays(self, nums: List[int], target: int) -> int: res = 0 n = len(nums) prefix = [0]*(n+1) for i in range(n): num = nums[i] if num == target: prefix[i+1]=prefix[i]+1 else: prefix[i+1]=prefix[i]-1 s = SortedList() res = 0 for num in prefix: l = s.bisect_left(num) res+= l s.add(num) return res
count_start_pos là số vị trí để mảng con bắt đầu tại đó, kết thúc ở num có target chiếm đa số (là những vị trí mà diff < current_diff).đoạn count_start_pos ý tưởng là sao vậy thím![]()
![]()
Fen đưa đoạn tính prefix sum rồi add vô sl vô 1 loop là được, dùng 1 biến count là đủ rồi
class Solution:
def countMajoritySubarrays(self, nums: List[int], target: int) -> int:
res, count = 0, 0
n = len(nums)
s = SortedList()
for i in range(n+1):
res += s.bisect_left(count)
s.add(count)
if i < n:
count = count+1 if nums[i]==target else count-1
return res

ầu... rất giống bài mod hôm nọcount_start_pos là số vị trí để mảng con bắt đầu tại đó, kết thúc ở num có target chiếm đa số (là những vị trí mà diff < current_diff).
Ý tưởng là ở mỗi bước current_diff (hiệu số giữa số giá trị bằng target và số giá trị không bằng target) chỉ lên xuống 1 đơn vị => Tận dụng count_start_pos ở vị trí trước đó rồi cộng trừ vào, không phải đếm lại từ đầu

(