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

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

基于 C++ 语言,利用双指针技巧解决两个经典算法题。针对有效三角形个数,先排序再固定一边用双指针统计组合;针对有序数组两数之和,直接首尾夹逼查找。代码含完整测试逻辑,适合算法基础巩固。

接口猎人发布于 2026/3/27更新于 2026/9/1056 浏览
C++ 双指针实战:有效三角形个数与和为 S 的两个数字

双指针应用场景

双指针是算法面试中的高频考点,尤其在处理有序数组或需要优化查找效率的场景下表现优异。本篇通过两个经典例题,深入剖析对撞指针的实际应用。

1. 有效三角形个数

题目描述

给定一个包含非负整数的数组 nums,统计其中能组成三角形的三元组个数。

思路解析

构成三角形的条件是任意两边之和大于第三边。如果我们将三个数从小到大排序为 a, b, c,那么只需满足 a + b > c 即可(因为 c 最大,其他不等式自然成立)。

暴力枚举需要 O(n³),我们可以利用排序和对撞指针将复杂度降至 O(n²)。

  1. 排序:先将数组升序排列。
  2. 固定最长边:从后往前遍历,固定 nums[i] 作为三角形的最长边。
  3. 双指针查找:在 [0, i-1] 区间内使用左右指针 left 和 right。
    • 若 nums[left] + nums[right] > nums[i],说明当前 right 与 left 到 right-1 之间的所有元素都能与 nums[i] 构成三角形。此时计数增加 right - left,并将 right 左移尝试更小的组合。
    • 若 nums[left] + nums[right] <= nums[i],说明两边之和太小,需增大较小边,将 left 右移。

核心实现

#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;
        
        
         ( i = n - ; i >= ; i--) {
             left = , right = i - ;
             (left < right) {
                 (nums[left] + nums[right] > nums[i]) {
                    
                    ret += right - left;
                    right--;
                }  {
                    
                    left++;
                }
            }
        }
         ret;
    }
};
// 从后往前固定最大边,至少需要三条边
for
int
1
2
int
0
1
while
if
// 满足条件,中间的所有数都满足
else
// 不满足,需要更大的左边值
return

测试用例

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

2. 和为 s 的两个数字

题目描述

给定一个已按升序排列的整数数组 price,找出两个数使它们的和等于目标值 target。

思路解析

由于数组已经有序,可以直接使用对撞指针,无需额外排序。

  1. 定义 left 指向头部,right 指向尾部。
  2. 计算两数之和:
    • 若和大于 target,说明数值过大,right 左移。
    • 若和小于 target,说明数值过小,left 右移。
    • 若相等,直接返回结果。
  3. 循环直到 left 与 right 相遇。

核心实现

#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) {
            int sum = price[left] + price[right];
            if (sum > target) {
                right--;
            } else if (sum < 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 (size_t i = 0; i < result.size(); i++) {
        cout << result[i];
        if (i < result.size() - 1) cout << ",";
    }
    cout << "]" << endl;
    return 0;
}

总结

这两个问题展示了双指针在不同场景下的变体:前者需要先排序再固定一边,后者利用已有有序性直接夹逼。掌握'排序预处理 + 指针智能移动'这一核心思想,有助于解决三数之和、四数之和等进阶问题。在实际编码中,注意边界条件和整数溢出风险,保持代码的可读性与健壮性。

目录

  1. 双指针应用场景
  2. 1. 有效三角形个数
  3. 题目描述
  4. 思路解析
  5. 核心实现
  6. 测试用例
  7. 2. 和为 s 的两个数字
  8. 题目描述
  9. 思路解析
  10. 核心实现
  11. 测试用例
  12. 总结

更多推荐文章

查看全部
  • 2025 年 AIGC 六大核心发展趋势
  • JavaScript 比较与逻辑运算符基础
  • Docker Desktop + WSL2 安装配置与核心应用实战
  • Java IO 流:从文件操作到网络通信
  • AI 辅助开发:使用 DeepSeek 构建贪吃蛇游戏
  • 使用 Anthropic Skill 提升大模型前端设计审美
  • 微信小程序原生前端开发入门:从零构建第一个可交互页面
  • Microsoft Edge WebView2 Runtime 快速部署与调试指南
  • 浏览器缓存机制详解:如何彻底解决前端代码更新后的缓存问题
  • 电商产品 AI 绘画提示词撰写指南
  • PyTorch JIT 与 TorchScript:实测推理性能提升 50%
  • 基于 Python 的 B 站充电视频下载工具
  • Rust 与 WebAssembly 实战:在浏览器与 Node.js 中运行高性能代码
  • 绿联 NAS 配置 WebDAV 公网访问并使用 RaiDrive 挂载
  • 上手 QClaw:从安装到让它帮你干活的真实体验
  • MySQL 数据库基础:概念、架构与核心使用指南
  • C++ 数组模拟链表原理与实现
  • Stable Diffusion 插件 StyleSelectorXL 七十七种绘画风格使用指南
  • 华为 ARM Linux 部署 Ollama 0.17.6 运行 Qwen3.5 模型测试
  • 大模型原理、训练流程与应用场景全面解析

相关免费在线工具

  • 加密/解密文本

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