LeetCode 1658. 将 x 减到 0 的最小操作数(哈希)
文章目录
- 1. 题目
- 2. 解题
1. 题目
给你一个整数数组 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 <= 10^5
1 <= nums[i] <= 10^4
1 <= x <= 10^9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-operations-to-reduce-x-to-zero
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 哈希记录前缀和及其长度
- 遍历后缀和 tailsum,在前缀和中查找 x-tailsum
class Solution {public:int minOperations(vector<int>& nums, int x) {int n = nums.size(), sum = 0;unordered_map<int,int> presum;presum[0] = 0;//前缀和为0时,长度为0for(int i = 0; i < n; i++) {sum += nums[i];presum[sum] = i+1;//前缀和对应的长度}int tailsum = 0, minlen = INT_MAX;if(presum.find(x) != presum.end())minlen = presum[x];for(int i = n-1; i >= 0; i--){tailsum += nums[i];int target = x - tailsum;if(presum.find(target) != presum.end() && presum[target] < i){minlen = min(minlen, presum[target]+n-i);}}return minlen==INT_MAX ? -1 : minlen;}
};
1088 ms 164.7 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 1658. 将 x 减到 0 的最小操作数(哈希)相关推荐
- LeetCode 1658. 将 x 减到 0 的最小操作数
1658. 将 x 减到 0 的最小操作数 给你一个整数数组 nums 和一个整数 x .每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值.请注意,需要 修改 ...
- Leecode 1658. 将 x 减到 0 的最小操作数 滑动窗口
原题链接:Leecode 1658. 将 x 减到 0 的最小操作数 自己写的代码: class Solution {public:int minOperations(vector<int> ...
- Leetcode-1658. 将 x 减到 0 的最小操作数
链接 1658. 将 x 减到 0 的最小操作数 题目 给你一个整数数组 nums 和一个整数 x .每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值.请注意 ...
- leetcode1658.将x见到0的最小操作数
题目大意 解题思路 分析题意,实际上是从数组的左半部分和右半部分分别取出一部分,两部分的和为x即可,找到最短的组合. 将nums从左累加,得到leftacc,将nums从右累加,得到rightacc. ...
- Leetcode 592. 分数加减运算 C++
Leetcode 592. 分数加减运算 题目 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 ...
- LeetCode 2033. 获取单值网格的最小操作数(贪心)
文章目录 1. 题目 2. 解题 1. 题目 给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x . 每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x . 单值网格 ...
- 《LeetCode力扣练习》第64题 最小路径和 Java
<LeetCode力扣练习>第64题 最小路径和 Java 一.资源 题目: 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为 ...
- 《LeetCode力扣练习》第155题 最小栈 Java
<LeetCode力扣练习>第155题 最小栈 Java 一.资源 题目: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. 实现 MinStack ...
- LeetCode 1769. 移动所有球到每个盒子所需的最小操作数(前缀和)
文章目录 1. 题目 2. 解题 1. 题目 有 n 个盒子.给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 '0' 表示第 i 个盒子是 空 的,而 boxes[i ...
最新文章
- 多分类f1分数_如何计算多标签分类中的F1测度?
- python 浏览器显示本地文件夹_从浏览器中打开本地文件文件夹
- 位运算及在java中的应用整理
- MySQL利用xtrabackup进行增量备份详细过程汇总
- php中cookie的用法
- WinForm 捕获最小化事件
- Linkis EngineConnPlugin引擎插件安装文档
- 3520a SDL_tff库做bmp 也就是osd
- 白盒测试之初识gtest工具
- v4l2驱动框架_【干货分享】Xilinx Linux V4L2视频管道(Video Pipeline)驱动程序分析...
- php多少内置函数,php有多少个内置函数
- 推荐系统之CTR预估-FNN模型解析
- webrtc 渲染_WebRTC 开发(六)摄像头采集与视频渲染分析
- 快速傅立叶变换_FFT
- 微信H5支付 以及退款
- 工作3年进阿里,取得P7职位,需要怎样的技术能力?(面试题附答案)
- 一起来学linux:网络命令
- English:英语学习口诀(实用)
- QT 主线程子线程互相传值
- 图像处理 图像相似算法aHash、dHash、pHash解析与对比