当前位置: 首页 > news >正文

算法入门:专题攻克二---滑动窗口3(将x减到0的最小操作数,水果成篮)

🎬 胖咕噜的稞达鸭:个人主页

🔥 个人专栏: 《数据结构》《C++初阶高阶》《算法入门》

⛺️技术的杠杆,撬动整个世界!

在这里插入图片描述

将 x 减到 0 的最小操作数

1658. 将 x 减到 0 的最小操作数
在这里插入图片描述

  1. 题目解析:

在整数数组nums中,每当移除数组最左边或者最右边的元素,就要从x中减去该元素的值,将x减到0,并且返回最小的操作数字,也就是从原数组中移除了多少个数字可以将x减到0,移除的数字越少就返回,改动原数组改动最小的返回。
给一个例子:nums=[ 1 , 1 , 4 , 2 , 3 ] ,此时x=5,移除数组索引为0的元素1,x-1=4,x现在还没被减到0,移除前两个元素和最后一个元素,x=0,此时改动了3个元素,返回3;还可以移除后两个元素,x = 0,此时只改动了两个元素,返回2.题目要求要返回最小的操作数,此时返回2.
如果数组中找不到可以使得x减到0的(如数组:nums = [ 5 , 6 , 7 , 8 , 9 ],返回-1即可。

  1. 算法原理:

同一个数组,操作数最小,x减去的数字越少就满足题目的要求,x中减去的数字越少也就意味着留下来的数字越多,也就是说最后比较的是,返回ret,ret的最大值即可。可以将所有数字都相加,最终结果放到sum中,如果所有元素的和等于sum-x,就可以计算此时最长的子数组的长度len.
可以先用暴力枚举的方法,用双指针left,right从数组索引为0的位置开始遍历,right从数组索引为0的位置开始向后,每遍历一个数字加到Add中。当Add大于sum-x的时候,意味着left该出窗口了,如果Add等于sum-x的时候,就是我们想要的结果,将ret更新,从更新前的ret到right-left+1的ret选取大的进行更新。最后返回的是数组的元素个数减去ret,本身要求的就是返回操作的最小数字。ret中的数字越多,操作的数字就越少。

还有一种情况:如果数组中找不到可以将x减为0的组合,返回-1.此时可以先将ret置为-1,初始化的时候置为-1,等到数组中有可以将x减为0的组合,再更新ret,这也是一个小细节。

  1. 现在来写代码。

第一步:
将数组中所有数字相加sum,我们要找的组合一定是等于sum-x
第二步:初始化ret,如果数组中没有组合可以将x减为0,返回-1;有就执行下面的操作;
第三步:定义双指针,进入窗口(当right一个一个遍历加到Add中,Add<sum-x);出窗口(当Add > sum-x,此时left需要向后移动一个位置,表示出窗口);再次判断,此时的left,right的区间内数字相加是不是Add==sum-x。如果是就更新ret,ret=right-left+1和ret(原始)的最大值。
第四步:返回。

class Solution {
public:int minOperations(vector<int>& nums, int x) {int sum=0;for(int a:nums) sum+=a;int target=sum-x;if(target<0) return -1;int ret=-1;for(int left=0,right=0,Add=0;right<nums.size();right++){Add+=nums[right];while(Add>target) {Add -= nums[left++]; }if(Add == target) {ret =max(ret,right-left+1);}}if(ret == -1)return ret=-1;else {return nums.size()-ret;}}
};

水果成篮

水果成篮
在这里插入图片描述

解法一
哈希表代替数组,申请足够大的空间,并将其初始化为0,最终要返回的是最长的子数组,这个子树组的特点是其中只有两个类型的数字,也就是他题目规定的只有两个篮子;
两个篮子用kinds代替;滑动窗口,进入窗口的操作,如果right的数字在哈希表中==0,kinds++,代表哈希表中多了一种水果,同时right++进入数组;
出窗口,当kinds>2left走到同一种水果的数量和种类都为零的时候,再向后移动一个位置,此时判断数组的长度,ret不断更新最大值。

class Solution {
public:int totalFruit(vector<int>& f) {int hash[1000001]={0};int ret=0;for(int left=0,right=0,kinds=0;right<f.size();right++){if(hash[f[right]] == 0)kinds++;hash[f[right]]++;while(kinds>2){ hash[f[left]]--;if(hash[f[left]]==0)kinds--;left++;}ret=max(ret,right-left+1);}return ret;}
};

解法二:创建一个哈希表,因为哈希表中总共存储的数字类型只有两个,所以进入数组的hash.size() 一旦大于2,就必须出窗口,出窗口的left必须走完所有类型,直到最后只剩下right一种类型,一旦在哈希表中hash[f[left]]==0,删除f[left],最后要让left走到新的的位置。还要判断此时的ret.更新一下结果。

class Solution {
public:int totalFruit(vector<int>& f) {unordered_map<int,int>hash;int ret=0;for(int left=0,right=0;right<f.size();right++){hash[f[right]]++;while(hash.size()>2){hash[f[left]]--;if(hash[f[left]]==0)hash.erase(f[left]);left++;}ret=max(ret,right-left+1);}return ret;}
};
http://www.dtcms.com/a/538382.html

相关文章:

  • 网站建设加盟创业做苗木网站哪家做得好
  • 安徽 两学一做 网站做网站月薪10万
  • 门户网站域名是什么意思郑州网站建设金麦建站
  • 如何做个网站推广自己产品如何做自己的公司网站
  • 建站快车管理中山做营销型网站公司
  • Docker容器启动Nacos
  • Ultra Dynamic Sky(UDS)天空系统讲解
  • 上海网站建设q479185700棒翠屏区网站建设
  • 【LUT技术专题】双边网格优化的3DLUT-SABLUT
  • 青海省网站建设高端群英云服务器
  • 漂亮公司网站源码打包下载龙江人社使用方法
  • wordpress wp_head函数东营优化公司
  • 模型置信度在实际中的应用
  • 网站建设策划书格式及范文南昌网站建设品牌
  • 哪些网站设计好企业邮箱格式怎么注册
  • zhi做网站ps做网页设计的尺寸
  • 中国做的很好的食品网站logo设计素材图片
  • 网站设计设计目的深圳网站设计制
  • 用什么网站做一手楼好百度快照举报网站
  • 浏览器无法访问wordpress报503企业网站seo实
  • 游戏盾是如何保障游戏安全稳定的
  • 青州网站建设优化排名个人网站导航html源码
  • CSS技巧:使用 box-shadow + outline 实现多重边框与圆角阴影完美结合
  • iis6.0新发布网站访问速度慢网络推广渠道有哪些哪些
  • 上海网站建设v芯ee8888e有梦商城公司网站
  • 上线了做网站怎么查看百度上做推广怎么做
  • Freerun、SM、DC三种同步模式
  • 宁波网站建设地址在哪电子商务网站设计毕业设计论文
  • 南昌外包建站免费域名邮箱注册
  • 省级精品课程网站营销导向的企业网站优化