《算法题讲解指南:优选算法-双指针》--05有效三角形的个数,06查找总价值为目标值的两个商品

《算法题讲解指南:优选算法-双指针》--05有效三角形的个数,06查找总价值为目标值的两个商品

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

05.有效三角形的个数

题目链接:

题目描述:

题目示例:

算法思路:

C++代码演示:

算法总结及流程解析:

06.查找总价值为目标值的两个商品

题目链接:

题目描述:

题目示例:

算法思路:

C++代码演示:

算法总结及流程解析:

结束语


05.有效三角形的个数

题目链接:

611. 有效三角形的个数 - 力扣(LeetCode)

题目描述:

题目示例:

解法:(排序+双指针)

算法思路:

  先将数组排序。

 判断三角形的优化方法:

  • 如果能构成三角形,需要满足任意两边之和大于第三边。但是实际上只需要让较小的两条边之和大于第三边即可

      根据【上述优化思想】我们可以固定一个【最长边】,然后在比这条边小的有序数组中找出一个二元组,使得这个二元组之和大于这个最长边。由于数组是有序的,我们可以利用【对撞指针】来优化

设最长边枚举到 i 位置 ,区间 【left,right】 是 i 位置左边的区间(也就是比它小的区间):

  1.如果 nums[ left ] + nums[ right ] > nums[ i ];

  • 说明【left,right - 1】区间上的所有元素均可以与 nums[ right ] 构成比 nums[ i ] 大的二元组
  • 满足条件的有 right - left 
  • 此时 right 位置的元素的所有情况相当于全部考虑完毕,right--,进入下一轮判断

2.如果 nums[ left ] + nums[ right ] <= nums[ i ]

  • 说明 left 位置的元素是不可能与 【left + 1,right】位置上的元素构成满足条件的二元组
  • left 位置的元素可以舍去, left++ 进去下轮循环

C++代码演示:

class Solution { public: int triangleNumber(vector<int>& nums) { sort(nums.begin(), nums.end()); int c = nums.size() - 1; int ret = 0; while(c > 1) { int left = 0; int right = c - 1; while(left < right) { if(nums[left] + nums[right] > nums[c]) { ret += (right - left); right--; } if(nums[left] + nums[right] <= nums[c]) { left++; } } c--; } return ret; } };

算法总结及流程解析:

06.查找总价值为目标值的两个商品

题目链接:

LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

题目描述:

题目示例:

解法:(双指针-对撞指针)

算法思路:

      注意到本题是升序的数组,因此可以用【对撞指针】优化时间复杂度。

算法流程:

1.初始化 left,right 分别指向数组的左右两端(这里不是我们理解的指针,而是数组的下标)

2.当 left < right 的时候,一直循环

        2.1当 nums[ left ] + nums[ right ] == target 时,说明找到结果,记录结果,并且返回;

        2.2当 nums[ left ] + nums[ right ] < target 时:

  • 对于 nums[left] 而言,此时 nums[right] 相当于是 nums[left] 能碰到的最大值(需要注意数组是升序)。如果此时不符合要求,说明在这个数组里面,没有别的数符合 nums[ left ] 的要求了。因此,我们可以大胆舍去这个数。让 left++,去比较下一组数据;
  • 那对于 nums[ right ] 而言,由于此时两数之和是小于目标值的, nums[ right ] 还可以选择比 nums[ left ] 大的值继续努力达到目标值,因此 right 指针我们按兵不动;

3.当 nums[ left ] + nums[ right ] > target 时。同理我们可以舍去 nums[ right ]。让 right-- ,继续比较下一组数据,而 left 指针不变(因为他还是可以去匹配比 nums[ right ] 更小的数)

C++代码演示:

class Solution { public: vector<int> twoSum(vector<int>& price, int target) { vector<int> ret; int left = 0; int right = price.size() - 1; while(left < right) { if(price[left] + price[right] > target) { right--; } else if(price[left] + price[right] < target) { left++; } else{ ret.push_back(price[left]); ret.push_back(price[right]); break; } } return ret; } };

算法总结及流程解析:

结束语

       到此,05有效三角形的个数 和 06查找总价值为目标值的两个商品 两道算法题就讲解完了。这两道题所用方法都是基于双指针算法的高效解题方法。强调排序预处理和指针移动策略在优化算法中的关键作用。希望大家能有所收获!

Read more

Agent系列——SPring AI Alibaba Graph初探

Agent系列——SPring AI Alibaba Graph初探

文章目录 * 一、概述 * 为什么需要Graph * 核心概念 * 二、快速入门 * 依赖版本 * pom.xml添加核心依赖 * 修改配置文件application.yaml * 创建状态图的配置类 * 创建一个Controller * 启动程序,查看效果 * 三、API详解 * KeyStrategyFactory(键策略工厂) * NodeAction&AsyncNodeAction * stateGraph(状态图) * CompiledGraph(编译图) * 四、案例:开发一个英语学习小助手 * 需求 * 思路分析 * 流程图 * 代码编写 * 定义SentenceConstructionNode造句节点 * 定义TranslationNode翻译节点 * 定义状态图 * 新增API接口 * 启动服务,访问接口 * 五、条件边 * 代码结构 * 定义GenerateJokeNode生成笑话节点 * 定

By Ne0inhk
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)

SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)

SQL Server是由微软推出的关系型数据库管理系统,它提供了可靠的数据存储、数据管理和数据分析功能。SQL Server支持多种数据处理功能,包括事务处理、数据分析、报表生成和数据挖掘等,因此在企业和组织中得到广泛应用。 演示系统:Windows server 2025数据中心版 安装包:下载传送门 1、下载并解压安装包,找到解压的安装包,双击【setup.exe】 2、双击【setup.exe】就会打开SQL Server安装中心,点击【安装】-【全新安装或向现有安装添加功能】 3、选择对应版本后,下一步 4、勾选“我接受许可条款”后下一步 5、下一步下一步 6、不勾选,下一步 7、勾选需要的功能,路径建议默认,下一步 8、下一步

By Ne0inhk
MySQL 数据类型核心指南:选型、实战与避坑

MySQL 数据类型核心指南:选型、实战与避坑

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. MySQL 数据类型分类总览 * 二. 数值类型:精准匹配数字范围与精度 * 2.1 整数类型(BIT/TINYINT/INT/BIGINT) * 2.1.1 TINYINT 类型测试 * 2.1.2 BIT 类型测试 * 2.1.3 INT/BIGINT 对比测试 * 2.2 小数类型(FLOAT/DOUBLE/DECIMAL) * 2.2.

By Ne0inhk
Flutter 组件 analyzer_testing 适配鸿蒙 HarmonyOS 实战:分析器插件测试,构建 AST 仿真与编译器级别静态诊断验证架构

Flutter 组件 analyzer_testing 适配鸿蒙 HarmonyOS 实战:分析器插件测试,构建 AST 仿真与编译器级别静态诊断验证架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 analyzer_testing 适配鸿蒙 HarmonyOS 实战:分析器插件测试,构建 AST 仿真与编译器级别静态诊断验证架构 前言 在鸿蒙(OpenHarmony)生态迈向深度定制化研发、涉及高性能自定义 Lint 规则集开发、代码自动化重构工具链及严苛的编译器插件质量底线的背景下,如何实现一套能够精确模拟抽象语法树(AST)、支持在无文件系统环境下执行实时代码分析且具备“像素级”错误定位能力的“分析器测试基座”,已成为决定研发工具链稳定性与代码诊断准确性的命脉。在鸿蒙项目涉及海量 eTS 与 Flutter 代码混合静态检查的复杂场景下,如果开发的分析器插件未经严格的语法全集覆盖测试,由于由于分析引擎的内部状态复杂性,极易由于由于“误报”或“漏报”导致鸿蒙应用在编译期发生难以排查的元数据错误。 我们需要一种能够解耦物理磁盘、支持声明式代码片段输入且具备 AST 结构断言能力的验证方案。 analyzer_testing 为

By Ne0inhk