另外,如果考虑到以每个起点的序列是有序的,可以直接使用堆来对每个序列进行维护,时间复杂度是O(k),由于本题中k ~= n ^ 2,所以依然会超时。
正确的解法就是第三种使用二分查找的方式求解。
时间复杂度:O(nlogn)
public long thekthSubarray(int[] a, long k) {
long l = 0;
long r = 0;
for (int num : a) r += num;
while (r - l > 1) {
long mid = l + (r - l) / 2;
if (helper(a, mid) >= k) r = mid;
else l = mid;
}
return r;
}
private long helper(int[] nums, long k) {
int n = nums.length;
long res = 0;
int start = 0;
long sum = 0;
for (int end = 0; end k) {
res += n - end;
sum -= nums[start++];
while (sum > k) sum -= nums[end--];
}
}
return (long)n * (n + 1) / 2 - res;
}