1658. 将 x 减到 0 的最小操作数


文章目录


1.题目

1658. 将 x 减到 0 的最小操作数

给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。

如果可以将 x 恰好 减到 0 ,返回 最小操作数 ;否则,返回 -1

示例 1:

复制代码
输入:nums = [1,1,4,2,3], x = 5
输出:2
解释:最佳解决方案是移除后两个元素,将 x 减到 0 。

示例 2:

复制代码
输入:nums = [5,6,7,8,9], x = 4
输出:-1

示例 3:

复制代码
输入:nums = [3,2,20,1,1,3], x = 10
输出:5
解释:最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0 。

2.思路

正难则反,通过移除一些元素,使得剩下的元素的和等于 sum(nums) - x,其中 sum(nums) 是数组所有元素的和,那么问题就转化为:找到这个最长子数组,剩余部分的元素就是要移除的,移除的操作数就是 nums.size() - 最长子数组的长度

3.代码

c++ 复制代码
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum = 0;
        // 计算数组所有元素的总和
        for(int i = 0; i < nums.size(); ++i){
            sum+=nums[i];
        }
        int target = sum - x;
        // 如果 target 小于 0,说明无法通过操作达到目标
        if (target < 0) return -1;
        int left = 0, right = 0, len = -1;
        int cur_sum = 0;
        // 遍历数组,右边界逐步向右扩展窗口
        while(right<nums.size()){
            cur_sum+=nums[right];
            ++right;
            // 如果当前窗口的和大于 target,缩小窗口
            while(cur_sum > target){
                cur_sum-=nums[left];
                ++left;
            }
            // 如果当前窗口的和等于 target,更新最长子数组的长度
            if(cur_sum == target)
                len = max(len, right-left);
        }
        return (len == -1) ? -1 : nums.size() - len;
    }
};

相关推荐
兮山与2 小时前
算法24.0
算法
晓北斗NorSnow2 小时前
机器学习核心算法与学习资源解析
学习·算法·机器学习
hans汉斯3 小时前
【计算机科学与应用】基于BERT与DeepSeek大模型的智能舆论监控系统设计
大数据·人工智能·深度学习·算法·自然语言处理·bert·去噪
多喝开水少熬夜4 小时前
损失函数系列:focal-Dice-vgg
图像处理·python·算法·大模型·llm
我命由我123454 小时前
Photoshop - Photoshop 工具栏(22)单行选框工具
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
立志成为大牛的小牛4 小时前
数据结构——三十七、关键路径(王道408)
数据结构·笔记·程序人生·考研·算法
ytttr8734 小时前
基于MATLAB的Relief算法特征权重选择实现
算法
Freshman小白5 小时前
python算法打包为docker镜像(边缘端api服务)
python·算法·docker
mit6.8246 小时前
[VT-Refine] Simulation | Fine-Tuning | docker/run.sh
算法
朴shu6 小时前
Delta数据结构:深入剖析高效数据同步的奥秘
javascript·算法·架构