the kth subarray
Jul 6, 2021
Last updated
Jul 6, 2021
Last updated
public class Solution {
/**
* @param a: an array
* @param k: the kth
* @return: return the kth subarray
*/
public long thekthSubarray(int[] a, long k) {
long[] prefixSum = new long[a.length + 1];
for (int i = 0; i < a.length; ++i) {
prefixSum[i + 1] = prefixSum[i] + a[i];
}
long left = 1, right = prefixSum[a.length];
while (left + 1 < right) {
long mid = (left + right) / 2;
long count = countSumLessThan(prefixSum, mid);
if (count < k) left = mid;
else right = mid;
}
if (countSumLessThan(prefixSum, left) == k) return left;
else return right;
}
// 返回和小于等于target的subarray的个数
private long countSumLessThan(long[] prefixSum, long target) {
long count = 0;
int left = 0, right = prefixSum.length - 1;
for (; left < right; ++left) {
while (prefixSum[right] - prefixSum[left] > target) {
// 只会在第一次run,之后right只会右移
right--;
}
while (right + 1 < prefixSum.length
&& prefixSum[right + 1] - prefixSum[left] <= target
) {
right++;
}
count += right - left;
}
return count;
}
}