- 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
- 65 lines of Java from the credited upstream file 2736.java.
- The implementation visibly relies on sequence storage.
- 6 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.
1class Solution {2 public int[] maximumSumQueries(int[] nums1, int[] nums2, int[][] queries) {3 MyPair[] pairs = getPairs(nums1, nums2);4 IndexedQuery[] indexedQueries = getIndexedQueries(queries);5 int[] ans = new int[queries.length];6 List<Pair<Integer, Integer>> stack = new ArrayList<>(); 7 8 int pairsIndex = 0;9 for (IndexedQuery indexedQuery : indexedQueries) {10 final int queryIndex = indexedQuery.queryIndex;11 final int minX = indexedQuery.minX;12 final int minY = indexedQuery.minY;13 while (pairsIndex < pairs.length && pairs[pairsIndex].x >= minX) {14 MyPair pair = pairs[pairsIndex++];15 16 17 18 final int x = pair.x;19 final int y = pair.y;20 while (!stack.isEmpty() && x + y >= stack.get(stack.size() - 1).getValue())21 stack.remove(stack.size() - 1);22 if (stack.isEmpty() || y > stack.get(stack.size() - 1).getKey())23 stack.add(new Pair<>(y, x + y));24 }25 final int j = firstGreaterEqual(stack, minY);26 ans[queryIndex] = j == stack.size() ? -1 : stack.get(j).getValue();27 }28 29 return ans;30 }31 32 private record MyPair(int x, int y){};33 private record IndexedQuery(int queryIndex, int minX, int minY){};34 35 private int firstGreaterEqual(List<Pair<Integer, Integer>> A, int target) {36 int l = 0;37 int r = A.size();38 while (l < r) {39 final int m = (l + r) / 2;40 if (A.get(m).getKey() >= target)41 r = m;42 else43 l = m + 1;44 }45 return l;46 }47 48 private MyPair[] getPairs(int[] nums1, int[] nums2) {49 MyPair[] pairs = new MyPair[nums1.length];50 for (int i = 0; i < nums1.length; ++i)51 pairs[i] = new MyPair(nums1[i], nums2[i]);52 Arrays.sort(pairs, Comparator.comparing(MyPair::x, Comparator.reverseOrder()));53 return pairs;54 }55 56 private IndexedQuery[] getIndexedQueries(int[][] queries) {57 IndexedQuery[] indexedQueries = new IndexedQuery[queries.length];58 for (int i = 0; i < queries.length; ++i)59 indexedQueries[i] = new IndexedQuery(i, queries[i][0], queries[i][1]);60 Arrays.sort(indexedQueries,61 Comparator.comparing(IndexedQuery::minX, Comparator.reverseOrder()));62 return indexedQueries;63 }64}65