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

一、题目描述

二、算法原理

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

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

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

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

②right++过程中只要sum > target, sum -= numsleft ,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;
    }
};
相关推荐
淡海水8 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
ClickHouseDB8 小时前
ClickHouse 大规模 OpenTelemetry 数据接入架构的可靠性演进
算法
有只小白叫岳飒8 小时前
c++智能指针 unique_ptr与函数调用
c++
Shaoshing8 小时前
BHU 润石工作室 251019自建赛题解
算法
Leo.yuan8 小时前
Kafka+Flink拼凑,还是FineDataLink 5.0一体化?实时数据处理的两种思路
c++·mfc
玩AI的奶茶8 小时前
24GB 显存能跑多大的模型?参数量、精度与显存占用对照表
人工智能·python·算法·ai·aigc·gpu算力·算力租赁
java_nnnn8 小时前
LeetCode刷题双指针(有效三角形的个数+三数之和)Java
算法·leetcode·职场和发展
人工智能培训8 小时前
智能博弈背景下中国AI国防建设的战略价值
大数据·人工智能·算法·重构·生活
flinn_small8 小时前
三分算法:原理、实现与实战应用
数据结构·算法·三分
思茂信息9 小时前
CST软件UV Slice切片后可直接删除指定一侧实体
算法·uv·emc·emi·cst·仿真软件