Welcome to Subscribe On Youtube
1918. Kth Smallest Subarray Sum
Description
Given an integer array nums
of length n
and an integer k
, return the kth
smallest subarray sum.
A subarray is defined as a non-empty contiguous sequence of elements in an array. A subarray sum is the sum of all elements in the subarray.
Example 1:
Input: nums = [2,1,3], k = 4 Output: 3 Explanation: The subarrays of [2,1,3] are: - [2] with sum 2 - [1] with sum 1 - [3] with sum 3 - [2,1] with sum 3 - [1,3] with sum 4 - [2,1,3] with sum 6 Ordering the sums from smallest to largest gives 1, 2, 3, 3, 4, 6. The 4th smallest is 3.
Example 2:
Input: nums = [3,3,5,5], k = 7 Output: 10 Explanation: The subarrays of [3,3,5,5] are: - [3] with sum 3 - [3] with sum 3 - [5] with sum 5 - [5] with sum 5 - [3,3] with sum 6 - [3,5] with sum 8 - [5,5] with sum 10 - [3,3,5], with sum 11 - [3,5,5] with sum 13 - [3,3,5,5] with sum 16 Ordering the sums from smallest to largest gives 3, 3, 5, 5, 6, 8, 10, 11, 13, 16. The 7th smallest is 10.
Constraints:
n == nums.length
1 <= n <= 2 * 104
1 <= nums[i] <= 5 * 104
1 <= k <= n * (n + 1) / 2
Solutions
-
class Solution { public int kthSmallestSubarraySum(int[] nums, int k) { int l = 1 << 30, r = 0; for (int x : nums) { l = Math.min(l, x); r += x; } while (l < r) { int mid = (l + r) >> 1; if (f(nums, mid) >= k) { r = mid; } else { l = mid + 1; } } return l; } private int f(int[] nums, int s) { int t = 0, j = 0; int cnt = 0; for (int i = 0; i < nums.length; ++i) { t += nums[i]; while (t > s) { t -= nums[j++]; } cnt += i - j + 1; } return cnt; } }
-
class Solution { public: int kthSmallestSubarraySum(vector<int>& nums, int k) { int l = 1 << 30, r = 0; for (int& x : nums) { l = min(l, x); r += x; } auto f = [&](int s) { int cnt = 0, t = 0; for (int i = 0, j = 0; i < nums.size(); ++i) { t += nums[i]; while (t > s) { t -= nums[j++]; } cnt += i - j + 1; } return cnt; }; while (l < r) { int mid = (l + r) >> 1; if (f(mid) >= k) { r = mid; } else { l = mid + 1; } } return l; } };
-
class Solution: def kthSmallestSubarraySum(self, nums: List[int], k: int) -> int: def f(s): t = j = 0 cnt = 0 for i, x in enumerate(nums): t += x while t > s: t -= nums[j] j += 1 cnt += i - j + 1 return cnt >= k l, r = min(nums), sum(nums) return l + bisect_left(range(l, r + 1), True, key=f)
-
func kthSmallestSubarraySum(nums []int, k int) int { l, r := 1<<30, 0 for _, x := range nums { l = min(l, x) r += x } f := func(s int) (cnt int) { t := 0 for i, j := 0, 0; i < len(nums); i++ { t += nums[i] for t > s { t -= nums[j] j++ } cnt += i - j + 1 } return } for l < r { mid := (l + r) >> 1 if f(mid) >= k { r = mid } else { l = mid + 1 } } return l }
-
function kthSmallestSubarraySum(nums: number[], k: number): number { let l = Math.min(...nums); let r = nums.reduce((sum, x) => sum + x, 0); const f = (s: number): number => { let cnt = 0; let t = 0; let j = 0; for (let i = 0; i < nums.length; i++) { t += nums[i]; while (t > s) { t -= nums[j]; j++; } cnt += i - j + 1; } return cnt; }; while (l < r) { const mid = (l + r) >> 1; if (f(mid) >= k) { r = mid; } else { l = mid + 1; } } return l; }
-
object Solution { def kthSmallestSubarraySum(nums: Array[Int], k: Int): Int = { var l = Int.MaxValue var r = 0 for (x <- nums) { l = l.min(x) r += x } def f(s: Int): Int = { var cnt = 0 var t = 0 var j = 0 for (i <- nums.indices) { t += nums(i) while (t > s) { t -= nums(j) j += 1 } cnt += i - j + 1 } cnt } while (l < r) { val mid = (l + r) / 2 if (f(mid) >= k) r = mid else l = mid + 1 } l } }
-
impl Solution { pub fn kth_smallest_subarray_sum(nums: Vec<i32>, k: i32) -> i32 { let mut l = *nums.iter().min().unwrap(); let mut r: i32 = nums.iter().sum(); let f = |s: i32| -> i32 { let (mut cnt, mut t, mut j) = (0, 0, 0); for i in 0..nums.len() { t += nums[i]; while t > s { t -= nums[j]; j += 1; } cnt += (i - j + 1) as i32; } cnt }; while l < r { let mid = (l + r) / 2; if f(mid) >= k { r = mid; } else { l = mid + 1; } } l } }