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.
정수 배열 nums와 정수 x가 주어집니다.
한 Operation 을 통해 nums의 왼쪽 끝이나 오른쪽 끝의 값을 제거하고 그만큼의 값을 x로부터 제거할수 있습니다.
최소한의 Operation 을 통해 x를 0으로 만들수 있는 Operation 의 횟수를 구하시오
단, 불가능할 경우엔 -1을 리턴합니다.
Input: nums = [1,1,4,2,3], x = 5
Output: 2
Explanation: 최적의 경우는 오른쪽에서 두번 제거한다.
class Solution:
def minOperations(self, nums: List[int], x: int) -> int:
if sum(nums) - x == 0:
return len(nums)
if sum(nums) < x:
return -1
target = sum(nums) - x
left = maximum = acc = count = 0
for right, value in enumerate(nums):
acc += nums[right]
# 만약 값이 너무 크다면, 왼쪽부터 Sliding window의 크기를 줄인다.
while left < right and target < acc:
acc -= nums[left]
left += 1
if target == acc:
maximum = max(maximum, right - left + 1)
# maximum의 값이 0이라는것은 하나도 구하지 못했다는 뜻이기에 그냥 -1을 리턴하면 된다.
return len(nums) - maximum if maximum != 0 else -1