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

★ 算法OJ题 ★ 力扣15 - 三数之和

Ciallo~(∠・ω< )⌒☆ ~ 今天,芝麻凛将和大家一起做一道双指针算法题--三数之和~

目录

一  题目

二  算法解析

三  编写算法


一  题目

15. 三数之和 - 力扣(LeetCode)

二  算法解析

解法一:排序 + 暴力枚举 + 利用set去重

时间复杂度:O(N^3)

解法二:排序 + 双指针

  • 排序;
  • 固定一个数C(C <= 0);
  • 在该数后面的区间内,利用双指针算法,快速找两个数的和为 -C。

这道题⾥⾯需要有去重操作~

  • 找到⼀个结果之后, left 和 right 指针要跳过重复的元素
  • 当使⽤完⼀次双指针算法之后,固定的 C 也要跳过重复的元素

三  编写算法

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums)
    {
        vector<vector<int>> ret; // 存放结果的顺序表~
        sort(nums.begin(), nums.end());  // 排序~
        int n = nums.size();
        // 固定数i
        for (int i = 0; i < n; ) // i的变化需要跳过相同的数,放后面写~
        {
            if (nums[i] > 0) // 小优化,三个大于0的数加起来不可能等于0~
                break;
            int left = i + 1, right = n - 1, target = -nums[i];
            while (left < right)
            {
                // 两数之和
                int sum = nums[left] + nums[right];
                if (sum == target)
                {
                    ret.push_back({ nums[i], nums[left], nums[right] });
                    left++;
                    right--;
                    // 去重,left right 跳过相同数,但不能越界
                    while (left < right && nums[left] == nums[left - 1])
                        left++;
                    while (left < right && nums[right] == nums[right + 1])
                        right--;
                }
                if (sum < target)
                    left++;
                if (sum > target)
                    right--;
            }
            i++;
            // 去重,i 跳过相同数,但不能越界
            while (i < n && nums[i] == nums[i - 1])
                i++;
        }
        return ret;
    }
};


http://www.kler.cn/a/286338.html

相关文章:

  • 计算机网络 (62)移动通信的展望
  • 深度学习的应用
  • C++中常用的十大排序方法之1——冒泡排序
  • 图论——floyd算法
  • 360大数据面试题及参考答案
  • 从 UTC 日期时间字符串获取 Unix 时间戳:C 和 C++ 中的挑战与解决方案
  • day25 Java基础——面向对象两万字详解!(纯干货)
  • wpf prism 《2》、导航
  • Linux 系统入门:高级系统管理与文本处理
  • mysql的聚簇索引、非聚簇索引、回表
  • VI设计和UI设计
  • C++初学(19)
  • nginx部署前端vue项目步骤
  • Android实现自定义方向盘-5livedata实现
  • 在SpringBoot项目中使用多线程(配合线程池)加快从MySQL导入数据到ElasticSearch的速度
  • Java 基础面试题
  • 华为od全面介绍!!!
  • 生产es所有节点全部掉线 排查
  • C++可调用对象
  • 神经网络——CIFAR10小实战
  • 如何构建大型超市数据处理系统?Java SpringBoot搭配MySQL,实现高效数据管理!
  • Axure RP10安装教程(Pro版)
  • 考试评分系统设计与实现/基于django的在线考试系统
  • 发布npm包到GitLab教程
  • 人工智能和机器学习5 (复旦大学计算机科学与技术实践工作站)语言模型相关的技术和应用、通过OpenAI库,调用千问大模型,并进行反复询问等功能加强
  • 【网络安全】服务基础第一阶段——第四节:Windows系统管理基础---- NTFS安全权限与SMB文件共享服务器