Medium
You are given an integer array nums
and an integer x
. In one operation, you can either remove the leftmost or the rightmost element from the array nums
and subtract its value from x
. Note that this modifies the array for future operations.
Return the minimum number of operations to reduce x
to exactly 0
if it is possible__, otherwise, return -1
.
Example 1:
Input: nums = [1,1,4,2,3], x = 5
Output: 2
Explanation: The optimal solution is to remove the last two elements to reduce x to zero.
Example 2:
Input: nums = [5,6,7,8,9], x = 4
Output: -1
Example 3:
Input: nums = [3,2,20,1,1,3], x = 10
Output: 5
Explanation: The optimal solution is to remove the last three elements and the first two elements (5 operations in total) to reduce x to zero.
Constraints:
1 <= nums.length <= 105
1 <= nums[i] <= 104
1 <= x <= 109
class Solution {
fun minOperations(nums: IntArray, x: Int): Int {
var totalArraySum = 0
for (each in nums) {
totalArraySum += each
}
if (totalArraySum == x) {
return nums.size
}
val target = totalArraySum - x
// as we need to find value equal to x so that x-x=0,
// and we need to search the longest sub array with sum equal t0 total array sum -x;
var sum = 0
var result = -1
var start = 0
for (end in nums.indices) {
sum += nums[end]
while (sum > target && start < nums.size) {
sum -= nums[start]
start++
}
if (sum == target) {
result = Math.max(result, end + 1 - start)
}
}
return if (result == -1) {
result
} else {
nums.size - result
}
}
}