将x减到0的最小操作数
1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)
Solution
和 1423. 可获得的最大点数 - 力扣(LeetCode)很相似,都是从两端拿数,转换为中间的连续子数组,从而用滑动窗口求解。
对于这道题,目标是求两端之和等于x的最小元素个数,也就是求连续和等于x的最大元素个数,直接用滑动窗口解决。
class Solution {
public:int minOperations(vector<int>& nums, int x) {int n = nums.size();int nums_sum = 0;for (int i = 0; i < n; ++i) {nums_sum += nums[i];}if (nums_sum < x)return -1;// cout << nums_sum << endl;// 目标是求两端之和等于x的最小元素个数// 也就是求连续和等于x的最大元素个数,直接用滑动窗口解决int l = 0, ans = -1, window_sum = 0, target = nums_sum - x;for (int r = 0; r < n; ++r) {window_sum += nums[r];// cout << window_sum << " ";if (window_sum == target)ans = max(ans, r - l + 1);while (window_sum > target) {window_sum -= nums[l];l++;if (window_sum == target)ans = max(ans, r - l + 1);}}if (ans != -1)return n - ans;elsereturn -1;}
};