【剑斩OFFER】算法的暴力美学——将 x 减到零的最小操作数

一、题目描述

二、算法原理

我们这道题的要求是找最小的次数的数组的和能刚到把 x 减为 0 ,直接按题目的要求来解题太困难了,我们可以运用一下反向思维,假设一个数组的长度位 4,和等于16,x = 5;那么 16 - 5 = 9,也就是说我们只要找到最长的子数组剩下的子数组就是题目要求的次数;例如:

所以我们由上图可知只要求出 sum - x 的最长子数组就可以得出题目要求的最小操作数。

思路:使用滑动窗口来解决。

①我们先定义两个指针来指向第一个数,再定义 len 来找到最长的子数组,再定义 sum 来表示right 在右移动的加起来值

②right++过程中只要sum > target, sum -= nums[left] ,left++;

③此时结果有两种:sum == target , sum < target ,只有 sum == target 才符合条件,所以才可以更新 len 的值。

模拟过程:

所以最终答案:数组的总长度 - len

三、代码实现

cpp 复制代码
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int right = 0, left = 0, sum = 0,target = 0;
        for(auto e : nums)
        {
            sum += e;
        }
        target = sum - x;
        if(target == 0) return nums.size();
        sum = 0;

        int len = -1;
        while(right < nums.size())
        {
            sum += nums[right];
            while(left < nums.size() && sum > target) sum -= nums[left++];
            if(sum == target) len = max(len,right - left + 1);
            right++;
        }
        if(len == -1) return len;
        else return nums.size() - len;
    }
};

探索性代码:

cpp 复制代码
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int right = 0, left = 0, sum = 0,target = 0;
        for(auto e : nums)
        {
            sum += e;
        }
        target = sum - x;
        if(target == 0) return nums.size();
        sum = 0;

        int len = 0;
        while(right < nums.size())
        {
            sum += nums[right];
            while(left < nums.size() && sum > target)
            {
                sum -= nums[left++];
            }
            if(sum == target) len = max(len,right - left + 1);
            right++;
        }
        return len == 0 ? -1 : nums.size() - len;
    }
};
相关推荐
君义_noip24 分钟前
信息学奥赛一本通 2134:【25CSPS提高组】道路修复 | 洛谷 P14362 [CSP-S 2025] 道路修复
c++·算法·图论·信息学奥赛·csp-s
kaikaile199536 分钟前
基于拥挤距离的多目标粒子群优化算法(MO-PSO-CD)详解
数据结构·算法
liulilittle37 分钟前
OPENPPP2 Code Analysis One
网络·c++·网络协议·信息与通信·通信
不忘不弃1 小时前
求两组数的平均值
数据结构·算法
leaves falling1 小时前
迭代实现 斐波那契数列
数据结构·算法
珂朵莉MM1 小时前
全球校园人工智能算法精英大赛-产业命题赛-算法巅峰赛 2025年度画像
java·人工智能·算法·机器人
Morwit1 小时前
*【力扣hot100】 647. 回文子串
c++·算法·leetcode
天赐学c语言1 小时前
1.7 - 删除排序链表中的重要元素II && 哈希冲突常用解决冲突方法
数据结构·c++·链表·哈希算法·leecode
w陆压1 小时前
12.STL容器基础
c++·c++基础知识
tobias.b2 小时前
408真题解析-2009-13-计组-浮点数加减运算
算法·计算机考研·408考研·408真题