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

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

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

王者发布于 2026/3/24更新于 2026/7/438 浏览
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  {
:
    {
        (nums.(), nums.()); 
         n = nums.(); 
         ret = ;
         ( i = n - ; i >= ; i--) { 
             left = , right = i - ;
             (left < right) {
                 (nums[left] + nums[right] > nums[i]) {
                    ret += right - left;
                    right--;
                }  {
                    left++;
                }
            }
        }
         ret;
    }
};
Solution
public
int triangleNumber(vector<int>& nums)
sort
begin
end
// 升序排序
int
size
// 数组大小
int
0
for
int
1
2
// 因为最少三条边,所以 i>=2
int
0
1
while
if
else
return

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. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • AI 大模型:何时使用或不使用 GraphRAG
  • C++ 二叉搜索树原理与增删查实现详解
  • 时序数据库选型指南:Apache IoTDB 国产开源技术实践
  • Spring Boot 微服务负载均衡实践
  • 基于 Java 的校园二手物品在线交易平台设计与实现
  • 基于 Java 的 B/S 架构小区物业管理系统设计与实现
  • Sim2Real 技术在机器人应用中的必要性分析
  • 机器人室内导航:SLAM 与“室内 GPS”融合解决定位漂移问题
  • 三星研究院 Shallow-π:基于知识蒸馏的机器人 VLA 模型优化
  • Git 安装配置与基础工作流实战指南
  • JDK 版本切换与 SQL Server SSL 连接问题排查
  • JDK 17 安装与环境配置实战指南
  • 动态规划:打家劫舍类问题
  • AI 普及时代,个体如何构建核心竞争力?
  • AI 大模型项目实战:多领域智能应用开发
  • AI 变现误区解析:为何掌握工具不等于获得收益
  • AI 小说生成器:基于大语言模型的长篇小说自动化创作
  • 网络安全入门核心知识点与技能体系梳理
  • 提示工程师:一个即将过时的职业
  • 二分算法实战:A-B 数对与烦恼的高考志愿
  • 相关免费在线工具

    • 加密/解密文本

      使用加密算法(如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