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

LeetCode 1658 | 将 x 减到 0 的最小操作数(C语言滑动窗口解法)

💡LeetCode 1658 | 将 x 减到 0 的最小操作数(C语言滑动窗口解法)

📅 作者:凡间的八戒
🧠 标签:LeetCode C语言算法 双指针 滑动窗口 数组


🚀 一、题目描述

给你一个整数数组 nums 和一个整数 x。每一次操作,你可以从数组的 最左侧最右侧 移除一个元素,并将该元素的值从 x 中减去。

请返回将 x 恰好减到 0 所需的最小操作数;如果无法做到,返回 -1


🔹 示例 1:

输入:

nums = [1,1,4,2,3], x = 5

输出:

2

解释:
最佳方案是移除右侧的 [2,3],共两次操作,使得 x 从 5 变为 0。


🔹 示例 2:

输入:nums = [5,6,7,8,9], x = 4
输出:-1

🔹 示例 3:

输入:nums = [3,2,20,1,1,3], x = 10
输出:5

解释:最佳方案是移除前 3 个元素和后 2 个元素,总共 5 次操作。


🔹 数据范围:

1 <= nums.length <= 10^5
1 <= nums[i] <= 10^4
1 <= x <= 10^9

💭 二、思路分析

题目看似是“左右两边取数”的操作题,但其实可以转化为一个更容易处理的 子数组问题

✅ 转化思路:

把「从两端取」转化为「保留中间一段」。


假设数组 nums 的总和为 sum,要从两端移除若干元素使得剩余的数和为 sum - x

因此,问题就变成了:

在数组中找到一个 和为 sum - x 的最长子数组,那么需要移除的元素数就是 n - len(该子数组)


✨ 举个例子:

nums = [1,1,4,2,3], x = 5
sum = 11
sum - x = 6

我们要找到一个子数组和为 6,比如 [1,4,1],长度为 3,那么最少操作数是:

n - len = 5 - 3 = 2

⚙️ 三、算法实现(C语言)

使用 滑动窗口 + 双指针 实现,时间复杂度 O(n)

#define MIN(a, b) ((a) < (b) ? (a) : (b))int minOperations(int* nums, int numsSize, int x) {int sum = 0;for (int i = 0; i < numsSize; i++)sum += nums[i];if (sum < x) return -1; // 无法凑到xif (sum == x) return numsSize; // 必须全部移除int target = sum - x;int left = 0, right = 0;int cur = 0, maxLen = -1;while (right < numsSize) {cur += nums[right++];while (cur > target) {cur -= nums[left++];}if (cur == target) {maxLen = (maxLen > (right - left)) ? maxLen : (right - left);}}return maxLen == -1 ? -1 : numsSize - maxLen;
}

🧪 四、测试结果

测试用例输入输出说明
Case 1[1,1,4,2,3], x=52移除 [2,3]
Case 2[5,6,7,8,9], x=4-1无法满足
Case 3[3,2,20,1,1,3], x=105移除前3后2

💚 所有样例均通过,运行时间 0ms。


🔍 五、复杂度分析

  • 时间复杂度: O(n),每个元素最多被左右指针访问一次
  • 空间复杂度: O(1),仅使用常数级辅助变量

🧩 六、思考与总结

这道题是典型的「从两端取数 → 滑动窗口转化」的思路题。
在面对这类题目时:

  1. 思维转化很关键
    不直接操作两端,而是考虑中间子数组的保留。

  2. 滑动窗口的灵活性
    利用双指针动态维护窗口区间,轻松求解最长连续子数组。

  3. 代码实现清晰简洁
    注意边界情况(sum < xsum == x)的提前返回。


🧠 七、延伸思考

这种思路还可以推广到:

  • 最长连续子数组求和问题
  • 前缀和 + 双指针优化
  • 滑动窗口在数组中的通用应用

✍️ 总结一句话:

这道题的关键不是数学计算,而是“思维转化 + 窗口技巧”。

👉 掌握滑动窗口思想,很多看似复杂的双端题都能迎刃而解!

http://www.dtcms.com/a/605057.html

相关文章:

  • 《Effective Java》解读第12条:始终要覆盖toString
  • Linux C语言编译器 | C语言开发的最佳实践与工具选择
  • 网站备案电话没接产品设计分析案例
  • 112、23种设计模式之命令模式(20/23)
  • 第6章:空间查询与地理处理
  • 使用 Docker Compose 一键更新:深入理解 docker-compose pull 的适用场景
  • 一次在VS2022中使用sqlite数据库故障排查过程
  • Mailjet Setup Pitfall Guide: SPF, DKIM, DMARC Deliverability
  • 最好的企业网站电子商务网站建设考试重点
  • 大学新校区建设网站北京seo方法
  • SPI学习(QA)
  • 怎么用数据仓库来进行数据治理?
  • Linux_6:FTP云盘项目
  • Spring Boot spring.factories文件详细说明
  • 网站seo文章免费asp地方门户网站系统
  • 《信息存储与管理》逻辑串讲
  • dify TTS部署 GPT-SoVITS
  • kotlin中SharedFlow的简单使用
  • Kotlin 中的 inline 和 reified 关键字
  • 开封府景点网站及移动端建设情况精品资源共享课网站建设 碧辉腾乐
  • 战场目标检测:Faster R-CNN与RegNetX-800MF融合实现建筑物人员坦克车辆识别_2
  • 易语言黑月编译器:提升编程效率与性能优化 | 深入解析易语言开发中的工具应用与技巧
  • Vibe Coding - 从Vibe Coding到Spec Coding_AI编码范式的进化之路
  • 宣化网站建设青岛网站制作推广平台
  • 【多模态大模型面经】 BERT 专题面经
  • Node.js 开发实战:从入门到精通
  • 草莓病害智能识别与分类_Cascade-RCNN_HRNetV2p-W18-20e_COCO实现
  • 改造多模块!!无法使用三方依赖的异常处理
  • JMeter 自动化实战:自动生成文件并传参接口的完整方案
  • AutoSAR实战:RTA-OS Counters操作系统计数器详解