package LeetCode_1658
/**
* 1658. Minimum Operations to Reduce X to Zero
* https://leetcode.com/problems/minimum-operations-to-reduce-x-to-zero/
* 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's 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. 1 <= nums.length <= 105
2. 1 <= nums[i] <= 104
3. 1 <= x <= 109
* */
class Solution {
/*
* solution: Sliding Window, Time complexity:O(n), Space complexity:O(1)
* 1. finding out the longest sub-array sum up to nums.sum-x,
* 2. the result is nums.size - sub-array.size,
* */
fun minOperations(nums: IntArray, x: Int): Int {
val target = nums.sum() - x
var lengthOfSubArray = Int.MIN_VALUE
var left = 0
var currentSum = 0
for (right in nums.indices) {
currentSum += nums[right]
while (currentSum > target && left <= right) {
currentSum -= nums[left]
left++
}
if (currentSum == target) {
lengthOfSubArray = Math.max(lengthOfSubArray, right - left + 1)
}
}
return if (lengthOfSubArray == Int.MIN_VALUE) -1 else nums.size - lengthOfSubArray
}
}