leetcode——将x减到0的最小操作数

发布时间:2024年01月19日

题目解析

题目链接
首先我们先看一下题目如下
在这里插入图片描述
我们来解析一下这个题目其实也很简单说的是给你一个整数和一个数组问你每当移除最左边和左右边的某个数字时x也减去该元素的值,问你这里面的最佳方案是什么。(最佳方案的意思也就是删除最少的元素个数)

所用算法

算法解析

第一次看到这个题目的时候可能会有些发懵尤其是这个题目的提示说我们需要更改数组这势必会引起一些误导让我们以为需要在原数组上进行更改,但是其实这个题目并不需要那么麻烦,我们想一下假设一个数组的各个元素和为sum,对于一个数组来说我们消除两边的数字使得消除的数字和恰好等于x那么对于剩下的数字,不就是sum-x吗?那么按照逆向思维是不是说我们只需要找到一个窗口使得窗口中的元素恰好等于sum-x即可
想到这里我相信很多同学肯定一拍脑门想到我去这不就是滑动窗口的经典使用吗?是的事实也正是如此,那么现在我们来看一下步骤吧

步骤

第一步:计算出sum的值也就是该数组的每个元素相加的和
在这里插入图片描述
第二步初始化滑动窗口:
在这里插入图片描述
第三步指针移动:当right移动到right和left之间的元素和恰好等于sum-x的时候更新一下长度即可更新数据
在这里插入图片描述

代码示例

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int left=0,right=0;
        int sum=0;
        int num=0;
       for(int a:nums) sum+=a;//算数组中值总的大小
        int target=sum-x;
        int ret=-1;
        if(target<0)return -1;
        while(right<nums.size()&&left<nums.size())
        {
            num+=nums[right++];//进窗口
            while(num>target&&left<nums.size()&&left>=0)
            {
                num-=nums[left];
                left++;
            }
            if(num==target)//更新结果
            {
                ret=max(ret,right-left+1);
            }
        }
        if(ret==-1)return -1;
        else  return nums.size()-ret;
    }
};
文章来源:https://blog.csdn.net/m0_72433000/article/details/135696805
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。