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

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

目录

[一 题目](#一 题目)

[二 算法解析](#二 算法解析)

[三 编写算法](#三 编写算法)


一 题目

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

二 算法解析

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

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

解法二:排序 + 双指针

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

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

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

三 编写算法

cpp 复制代码
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;
    }
};
相关推荐
kong79069282 分钟前
Python核心语法-Python自定义模块、Python包
开发语言·python·python核心语法
数智工坊5 分钟前
【操作系统-文件管理】
数据结构·数据库
龙山云仓22 分钟前
No131:AI中国故事-对话荀子——性恶论与AI约束:礼法并用、化性起伪与算法治理
大数据·人工智能·深度学习·算法·机器学习
夏鹏今天学习了吗30 分钟前
【LeetCode热题100(90/100)】编辑距离
算法·leetcode·职场和发展
爱敲代码的小鱼1 小时前
事务核心概念与隔离级别解析
java·开发语言·数据库
芒克芒克1 小时前
数组去重进阶:一次遍历实现最多保留指定个数重复元素(O(n)时间+O(1)空间)
数据结构·算法
小冷coding1 小时前
【Java】遇到微服务接口报错导致系统部分挂掉时,需要快速响应并恢复,应该怎么做呢?如果支付服务出现异常如何快速处理呢?
java·开发语言·微服务
星火开发设计1 小时前
二维数组:矩阵存储与多维数组的内存布局
开发语言·c++·人工智能·算法·矩阵·函数·知识
夜勤月1 小时前
彻底终结内存泄漏与悬挂指针:深度实战 C++ 智能指针底层原理与自定义内存池,打造稳如泰山的系统基石
开发语言·c++
HeisenbergWDG1 小时前
线程实现runnable和callable接口
java·开发语言