跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 双指针算法:有效三角形个数与和为 S 的两个数字

综述由AI生成C++ 双指针算法解决有效三角形个数与和为 s 的两个数字问题。通过排序数组,利用对撞指针优化查找过程。第一题固定最大边,在剩余区间内寻找满足两边之和大于第三边的组合;第二题针对有序数组,通过左右指针相向移动判断和与目标值的大小关系。代码实现包含核心逻辑及测试用例,展示了排序预处理加指针移动的经典算法思想。

王者发布于 2026/3/24更新于 2026/5/2016 浏览
C++ 双指针算法:有效三角形个数与和为 S 的两个数字

在这里插入图片描述

1. 有效三角形个数

1.1 题目链接

题目链接

1.2 题目描述

在这里插入图片描述

1.3 题目示例

在这里插入图片描述

1.4 算法思路

  1. 构成三角形的条件:两边之和大于第三边,两边之差小于第三边。验证这两个条件较繁琐,排序后可简化。
  2. 当三个数 a、b、c 从小到大排序后,只需满足 a + b > c 即可构成有效三角形。
  3. 在排序后的数组中,固定最大的边 nums[k] 作为三角形的第三边,然后在 [0, k-1] 范围内使用对撞指针寻找满足条件的两边。
    • 设置 left = 0 和 right = k-1。当 nums[left] + nums[right] > nums[k] 时,由于数组升序排列,left 到 right-1 的所有位置与当前 right 组成的配对都能满足条件。计数器增加 right - left 个有效组合,然后将 right 左移一位。
    • 如果 nums[left] + nums[right] <= nums[k],说明两边之和太小,将 left 右移来增加两边之和。

1.5 核心代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end()); // 升序排序
        int n = nums.size(); // 数组大小
        int ret = 0;
        for (int i = n - 1; i >= 2; i--) { // 因为最少三条边,所以 i>=2
            int left = 0, right = i - 1;
            while (left < right) {
                if (nums[left] + nums[right] > nums[i]) {
                    ret += right - left;
                    right--;
                } else {
                    left++;
                }
            }
        }
        return ret;
    }
};

1.6 示例测试(总代码)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

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

int main() {
    vector<int> nums1 = {4, 2, 3, 4};
    cout << Solution().triangleNumber(nums1) << endl;
    return 0;
}

在这里插入图片描述

2. 和为 s 的两个数字

2.1 题目链接

题目链接

2.2 题目描述

在这里插入图片描述

2.3 题目示例

在这里插入图片描述

2.4 算法思路

  1. 题目说明数组已升序,可采用对撞指针实现。
  2. 一个指向第一个数据,一个指向最后一个数据,然后相加。
  3. 如果结果大于 target 说明过大,right--;如果结果小于 target 说明太小,left++;如果相等就返回,直到 left 和 right 指向同一个位置循环停止。

2.5 核心代码

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) {
        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 {
                return {price[left], price[right]};
            }
        }
        return {-1, -1};
    }
};

2.6 示例测试(总代码)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) {
        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 {
                return {price[left], price[right]};
            }
        }
        return {-1, -1};
    }
};

int main() {
    vector<int> nums1 = {3, 9, 12, 15};
    vector<int> result = Solution().twoSum(nums1, 18);
    cout << "[";
    for (int i = 0; i < result.size(); i++) {
        cout << result[i];
        if (i < result.size() - 1) {
            cout << ",";
        }
    }
    cout << "]" << endl;
    return 0;
}

在这里插入图片描述

总结

本文通过「有效三角形个数」和「和为 s 的两个数字」两个经典问题,展示了双指针在数学组合问题中的精妙应用。掌握这些基础模型后,可进一步挑战三数之和、四数之和等进阶问题,核心思想均为排序预处理加指针智能移动。

目录

  1. 1. 有效三角形个数
  2. 1.1 题目链接
  3. 1.2 题目描述
  4. 1.3 题目示例
  5. 1.4 算法思路
  6. 1.5 核心代码
  7. 1.6 示例测试(总代码)
  8. 2. 和为 s 的两个数字
  9. 2.1 题目链接
  10. 2.2 题目描述
  11. 2.3 题目示例
  12. 2.4 算法思路
  13. 2.5 核心代码
  14. 2.6 示例测试(总代码)
  15. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Seedance 2.0 成本诊断插件:内置实时 FLOPs/USD 热力图与优化策略
  • FPGA 开发从入门到实战指南
  • Python 窗体编程技术详解
  • 多模态文本智能技术:AI 语义理解与执行架构解析
  • Selenium Web 自动化测试入门与实战指南
  • Linux 多线程初探:从进程到轻量级执行流
  • 金仓数据库与 InfluxDB 性能及 SQL 兼容性对比分析
  • Docker 安装 Neo4j 图数据库教程
  • 基于 KaiwuDB 与 CodeArts 智能体的智能家居本地化数据处理方案
  • Spring 依赖注入的三种实现方式
  • 网络安全入门教程:从零开始到精通的系统学习路线
  • 天然气管道内检测机器人检测节结构设计与仿真分析
  • Java 项目 Skill 体系设计方案与实战
  • Python 基础语法入门:常量、变量与运算符详解
  • Java SE 文件 IO 基础:File 类与文件系统操作
  • Claude Code 的三大核心执行模式
  • Git 基础概念与指令快速入门
  • ToClaw:基于 OpenClaw 的云端 AI 自动化助手评测
  • Vue3+TypeScript 中 Promise<string> 转 string 类型错误解析及异步处理
  • Kimi K2.5 开源部署、API 接入、Agent 集群与多模态视觉实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online