链接

1658. 将 x 减到 0 的最小操作数

题目

给你一个整数数组 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 <= 10e5
  • 1 <= nums[i] <= 10e4
  • 1 <= x <= 10e9

思路一

枚举所有可能的情况,记录需要的次数,返回其中最小的次数,然而暴力超时

C++ Code

class Solution {
public:int minOperations(vector<int>& nums, int x) {//前缀和 + 后缀和vector<int> front(nums.size(),0);vector<int> behind(nums.size(),0);vector<int> result;int sum=0;for(int i=0;i<nums.size();i++){sum+=nums[i];front[i]=sum;if(sum==x) result.push_back(i+1);}sum =0;for(int i=nums.size()-1;i>=0;i--){sum+=nums[i];behind[nums.size()-1-i]=sum;if(sum==x) result.push_back(nums.size()-1-i+1);}for(int i=0;i<front.size();i++){   for(int j=0;j<nums.size()-i-1;j++){if(front[i]+behind[j]==x){result.push_back(i+j+2) ;}}}if(!result.empty()) return *min_element(result.begin(),result.end());return -1;}
};

思路二

此题有个很巧妙的思路,把这个问题转换成我们以前见过的常规问题,我们要求两边的和为x,其实就等价于求是否存在中间的连续区间的和为sum-x,sum为整个数组的和,而中间和为sum-x的区间越长,两边和为x的区间就越短,中间的区间假设最大长为len,最少的操作次数就是N-len。

那么求中间最长的和为sum-x的区间我们就可以用滑动窗口法了。

C++ Code

lass Solution {public int minOperations(int[] nums, int x) {int sum= 0;for(int num: nums) sum += num;int target = sum -x;if(target < 0) return -1; //数据范围[1,10e9]int left =0, right=0 ,max=Integer.MIN_VALUE;while (right < nums.length){target -=nums[right++];while (target < 0) target+=nums[left++]; if(target==0) max=Math.max( max , right -left);}return max==Integer.MIN_VALUE? -1 :nums.length -max;}
}

Leetcode-1658. 将 x 减到 0 的最小操作数相关推荐

  1. LeetCode 1658. 将 x 减到 0 的最小操作数

    1658. 将 x 减到 0 的最小操作数 给你一个整数数组 nums 和一个整数 x .每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值.请注意,需要 修改 ...

  2. LeetCode 1658. 将 x 减到 0 的最小操作数(哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums 和一个整数 x .每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值.请注意,需要 修 ...

  3. Leecode 1658. 将 x 减到 0 的最小操作数 滑动窗口

    原题链接:Leecode 1658. 将 x 减到 0 的最小操作数 自己写的代码: class Solution {public:int minOperations(vector<int> ...

  4. leetcode1658.将x见到0的最小操作数

    题目大意 解题思路 分析题意,实际上是从数组的左半部分和右半部分分别取出一部分,两部分的和为x即可,找到最短的组合. 将nums从左累加,得到leftacc,将nums从右累加,得到rightacc. ...

  5. Leetcode 592. 分数加减运算 C++

    Leetcode 592. 分数加减运算 题目 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 ...

  6. LeetCode 2033. 获取单值网格的最小操作数(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x . 每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x . 单值网格 ...

  7. 《LeetCode力扣练习》第64题 最小路径和 Java

    <LeetCode力扣练习>第64题 最小路径和 Java 一.资源 题目: 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为 ...

  8. 《LeetCode力扣练习》第155题 最小栈 Java

    <LeetCode力扣练习>第155题 最小栈 Java 一.资源 题目: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. 实现 MinStack ...

  9. LeetCode 1769. 移动所有球到每个盒子所需的最小操作数(前缀和)

    文章目录 1. 题目 2. 解题 1. 题目 有 n 个盒子.给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 '0' 表示第 i 个盒子是 空 的,而 boxes[i ...

最新文章

  1. 达梦数据库修改字段长度_DM7 达梦数据库 序列 和 自增列 说明
  2. 行业 | 调查:移动游戏盈利60%来源于0.23%付费玩家
  3. mount and fstab的使用(整理)
  4. Executor 执行器接口笔记
  5. CentOS虚拟机不能联网状况下yum方式从本地安装软件包
  6. php mysql 排序规则_使用PHP的MySQL最好的排序规则是什么?
  7. 中英文对照 —— 计算机编程
  8. 几个IE与Firefox的兼容性问题 (一、网络转载)
  9. 高级商务办公软件应用【3】
  10. TongLINK/Q7.X 8.x查看队列情况命令
  11. 冰冻三尺非一日之寒,坚持,坚持,再坚持!
  12. 元宇宙:从现实到虚无祛魅的产物|广州华锐互动
  13. svg绘制蝌蚪状飞线
  14. Mybatis最拿得出手的功能之一 SpringBoot整合Mybatis-Plus 实战之动态SQL
  15. 独热编码(One-Hot Encoding)
  16. uva 10286 Trouble with a Pentagon
  17. 短线黄金做波段的策略分析
  18. ch340t电路_ch340g电路图5v和3.3v供电电路
  19. freopen函数的使用以及freopen与fopen的区别 open、fopen、freopen区别(文件操作)
  20. 日志搜集系统从ELK到EFK

热门文章

  1. CString查找子字符串
  2. 暗黑如何修改服务器爆率,暗黑破坏神百倍爆率补丁
  3. unity添加天空盒的两种方式
  4. oracle 12c导入dmp文件(实践)
  5. 苹果2022春季新品发布会 苹果春季新品发布会直播地址
  6. 【taro】taro如何打开微信小程序
  7. canvas实现图片缩放+涂鸦
  8. [转载] 老鼠夹的寓言
  9. 《PHP挖宝》2—Symfony包介绍
  10. 运维工单系统 php,运维平台体系化建设之工单系统