class Solution {
public:
int minOperations(vector<int>& nums, int x) {
int N = nums.size();
int sum = accumulate(nums.begin(), nums.end(), 0);
int start = 0, end = 0, subSum = 0, result = -1;
while (start < N) {
if (subSum > sum - x) {
// remove start element from sub array
subSum -= nums[start];
++start;
} else if (subSum < sum - x) {
if (end == N) break;
// add end element to sub array
subSum += nums[end];
++end;
} else {
// get maximum length of sub array
if (end - start > result) {
result = end - start;
}
// remove start element from sub array for next iteration
subSum -= nums[start];
++start;
}
}
// min ops = N - max sub arr length
return result != -1? N - result : -1;
}
};
๋ค๋ง sub array๋ array 2๊ฐ๋ฅผ ์ด์ด๋ถ์ธ ๊ฒฝ๊ณ์ ์ ๊ฑธ์ณ ์์ด์ผ ํ๋ฏ๋ก ์์์ ๊ณผ ๋์ ์ด ๊ฒฝ๊ณ์ ์ ๋ฒ์ด๋๋ฉด ์๋๋ค. start <= N && end >= N - 1
๋ํ sub array์ ๊ธธ์ด๊ฐ array์ ๋ณธ๋ ๊ธธ์ด N ๋ณด๋ค ์ปค์๋ ์๋๋ค.
class Solution {
public:
int minOperations(vector<int>& nums, int x) {
int N = nums.size();
int tN = N * 2;
int start = 0, end = 0, sum = 0, result = tN;
while (start < tN) {
if (sum > x) {
sum -= nums[start % N];
++start;
} else if (sum < x) {
if (end == tN) break;
sum += nums[end % N];
++end;
} else {
if (start <= N && end >= N - 1) {
result = min(result, end - start);
}
sum -= nums[start % N];
++start;
}
}
return result <= N? result : -1;
}
};