- Choose the invariant that makes a window valid or useful.
- Advance the right boundary and add the new element.
- Move the left boundary only as needed while maintaining the invariant and updating the answer.
Code notes
- 129 lines of Python from the credited upstream file threshold-majority-queries.py.
- The implementation visibly relies on sequence storage, ordered lookup.
- No explicit loop blocks detected.
Complexity
Confirm that neither pointer moves backwards; if so, the scan is usually linear apart from the window’s data-structure operations.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
123 45class Solution(object):6 def subarrayMajority(self, nums, queries):7 """8 :type nums: List[int]9 :type queries: List[List[int]]10 :rtype: List[int]11 """12 13 def mo_s_algorithm(): 14 def add(i): 15 idx = num_to_idx[nums[i]]16 if cnt[idx]:17 cnt2[cnt[idx]] -= 118 cnt[idx] += 119 cnt2[cnt[idx]] += 120 max_freq[0] = max(max_freq[0], cnt[idx])21 22 def remove(i): 23 idx = num_to_idx[nums[i]]24 cnt2[cnt[idx]] -= 125 if not cnt2[max_freq[0]]:26 max_freq[0] -= 127 cnt[idx] -= 128 if cnt[idx]:29 cnt2[cnt[idx]] += 130 31 def get_ans(t): 32 if max_freq[0] < t:33 return -134 i = next(i for i in xrange(len(cnt)) if cnt[i] == max_freq[0])35 return sorted_nums[i]36 37 cnt = [0]*len(num_to_idx)38 cnt2 = [0]*(len(nums)+1)39 max_freq = [0]40 result = [-1]*len(queries)41 block_size = int(len(nums)**0.5)+1 42 idxs = range(len(queries))43 idxs.sort(key=lambda x: (queries[x][0]block_size, queries[x][1] if (queries[x][0]block_size)&1 else -queries[x][1])) 44 left, right = 0, -145 for i in idxs: 46 l, r, t = queries[i]47 while left > l:48 left -= 149 add(left)50 while right < r:51 right += 152 add(right)53 while left < l:54 remove(left)55 left += 156 while right > r:57 remove(right)58 right -= 159 result[i] = get_ans(t)60 return result61 62 sorted_nums = sorted(set(nums))63 num_to_idx = {x:i for i, x in enumerate(sorted_nums)}64 return mo_s_algorithm()65 66 676869from sortedcontainers import SortedList70 71 7273class Solution_TLE(object):74 def subarrayMajority(self, nums, queries):75 """76 :type nums: List[int]77 :type queries: List[List[int]]78 :rtype: List[int]79 """80 81 def mo_s_algorithm(): 82 def add(i): 83 idx = num_to_idx[nums[i]]84 if cnt[idx]:85 lookup[cnt[idx]].remove(nums[i])86 cnt[idx] += 187 lookup[cnt[idx]].add(nums[i])88 max_freq[0] = max(max_freq[0], cnt[idx])89 90 def remove(i): 91 idx = num_to_idx[nums[i]]92 lookup[cnt[idx]].remove(nums[i])93 if not lookup[max_freq[0]]:94 max_freq[0] -= 195 cnt[idx] -= 196 if cnt[idx]:97 lookup[cnt[idx]].add(nums[i])98 99 def get_ans(t): 100 return lookup[max_freq[0]][0] if max_freq[0] >= t else -1101 102 cnt = [0]*len(num_to_idx)103 lookup = [SortedList() for _ in xrange(len(nums)+1)]104 max_freq = [0]105 result = [-1]*len(queries)106 block_size = int(len(nums)**0.5)+1 107 idxs = range(len(queries))108 idxs.sort(key=lambda x: (queries[x][0]block_size, queries[x][1] if (queries[x][0]block_size)&1 else -queries[x][1])) 109 left, right = 0, -1110 for i in idxs: 111 l, r, t = queries[i]112 while left > l:113 left -= 1114 add(left)115 while right < r:116 right += 1117 add(right)118 while left < l:119 remove(left)120 left += 1121 while right > r:122 remove(right)123 right -= 1124 result[i] = get_ans(t)125 return result126 127 num_to_idx = {x:i for i, x in enumerate(sorted(set(nums)))}128 return mo_s_algorithm()129