day115—同向双指针—将x减到0的最小操作数(LeetCode-1658)

题目描述

给你一个整数数组 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 。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 104
  • 1 <= x <= 109

解决方案:

核心转换思路:

  1. 原本问题:从数组两端 删除元素,使删除的元素和等于 x

  2. 等价问题:找到数组中间一个连续子数组 ,使其和等于 total - x

  3. 这样两端删除的次数最少 = 数组总长度 - 中间子数组长度最大

算法步骤:

  1. 计算数组总和 total

  2. 计算中间子数组的目标和:midSum = total - x

  3. 如果 midSum < 0:不可能,返回 -1

  4. 如果 midSum == 0:需要删除所有元素,返回数组长度

  5. 用滑动窗口找和为 midSum的最长连续子数组

  6. 如果找到:返回 len - 最长子数组长度

  7. 如果没找到:返回 -1

滑动窗口细节:

  • 维护窗口 [left, i]的和为 sum

  • 当 sum > midSum时,从左收缩窗口

  • 当 sum == midSum时,更新最大窗口长度

  • 窗口长度越大,两端删除的元素就越少

时间复杂度:O(n),每个元素最多进出窗口一次

举例:

cpp 复制代码
nums = [1,1,4,2,3], x = 5
total = 11, midSum = 6
最长和为6的子数组:[1,1,4],长度=3
最小操作次数 = 5 - 3 = 2
删除两端元素:[2,3]

结果:返回删除两端元素的最少操作次数,如果不可能则返回 -1。

函数源码:

cpp 复制代码
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int len =nums.size();
        int ans=0;
        int left=0;

        int midSum=accumulate(nums.begin(),nums.end(),0) - x;//求和
        if(midSum<0)   return -1;
        if(midSum==0)  return len;

        int sum=0;
        for(int i=0;i<len;i++){
            sum+=nums[i];
            while(sum>midSum){
                sum-=nums[left];
                left+=1;
            }
            if(sum==midSum) ans=max(ans,i-left+1);
        }
        return ans==0? -1:len-ans;
    }

};
相关推荐
强哥聊算力4 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
Navigator_Z7 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy8 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
mmmmath_38 小时前
LeetCode.104.二叉树的最大深度
数据结构·leetcode
YangYang9YangYan9 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法
jsjzsl29 小时前
递归自改进系统(RSI)的本质是自发对称破缺:智能爆炸有界—— AI研发切记盲目投入
人工智能·python·算法
程序员清风9 小时前
最短路径算法:BFS、Dijkstra 与 Floyd
java·算法·宽度优先
梦帮科技9 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
171320330计算机毕设编程10 小时前
计算机毕业设计 基于YOLO改进算法的车辆特征识别系统设计与实现--lw
java·大数据·python·sql·算法