From 4f774dbdfae7dfca4f161d98e2708ff096e33b4c Mon Sep 17 00:00:00 2001 From: Hieu Luong Date: Wed, 29 Jul 2020 15:04:40 +0200 Subject: [PATCH] Solve Problem 1508 - Range Sum Of Sorted Subarray Sums --- src/Main.java | 4 +- ...blem1508_RangeSumOfSortedSubarraySums.java | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/binarysearch/Problem1508_RangeSumOfSortedSubarraySums.java diff --git a/src/Main.java b/src/Main.java index a617bfb..c0c7a64 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,8 +1,8 @@ -import quickselect.Problem347_TopKFrequentElements; +import binarysearch.Problem1508_RangeSumOfSortedSubarraySums; public class Main { public static void main(String[] args) { - Problem347_TopKFrequentElements.run(); + Problem1508_RangeSumOfSortedSubarraySums.run(); } } diff --git a/src/binarysearch/Problem1508_RangeSumOfSortedSubarraySums.java b/src/binarysearch/Problem1508_RangeSumOfSortedSubarraySums.java new file mode 100644 index 0000000..8931c72 --- /dev/null +++ b/src/binarysearch/Problem1508_RangeSumOfSortedSubarraySums.java @@ -0,0 +1,56 @@ +package binarysearch; + +import lib.Printer; + +public class Problem1508_RangeSumOfSortedSubarraySums { + + int B[]; + public int rangeSum(int[] A, int n, int left, int right) { + B = new int[n+1]; + for (int i = 0; i < n; i++) B[i+1] = B[i] + A[i]; + return sum_k_sums(right) - sum_k_sums(left-1); + } + + private int sum_k_sums(int k) { + int score = kth_score(k), res = 0, i; +// System.out.println(score); + for (int j = 1; j < B.length; j++) { + i = j-1; + while (i >= 0 && B[j]-B[i] <= score) { +// System.out.print(B[j]-B[i] + " "); + res += B[j]-B[i]; + i--; + } + if (i == j-1) break; + } + return res; + } + + private int kth_score(int k) { + if (k == 0) return 0; + int lo = 1, hi = B[B.length-1]; + while (lo < hi) { + int mi = lo + (hi-lo)/2; + if (count_sum_under(mi) < k) lo = mi+1; + else hi = mi; + } + return lo; + } + + private int count_sum_under(int score) { + int res = 0; + for (int j = 1, i = 0; j < B.length; j++) { + while (B[j]-B[i] > score) i++; + if (i == j) break; + res += j-i; + } + return res; + } + + public static void run() { + Problem1508_RangeSumOfSortedSubarraySums solution = new Problem1508_RangeSumOfSortedSubarraySums(); + int A[] = {1,2,3,4}, n = 4, left = 1, right = 5; + int res = solution.rangeSum(A, n, left, right); + Printer.print(res); + } +}