leetcode-15. 三数之和(双指针)

简介: 我们遍历数组元素为x,双指针Left和Right,Left从x后一位开始移动,Right从数组最后一位开始移动,同时只能有一个指针在动,使得x + Left + Right == 0。

7a575079218f4cc0ab9cdb999ef7f031.png


题目链接:https://leetcode.cn/problems/3sum/


思想


方法:双指针


直接想法


我们遍历数组元素为x,双指针Left和Right,Left从x后一位开始移动,Right从数组最后一位开始移动,同时只能有一个指针在动,使得x + Left + Right == 0。


算法


  • 特判,对于数组长度 n < 3,返回 nil。
  • 对数组进行排序
  • 初始化一个ans的二维切片
  • 循环遍历数组

。若nums[i] > 0,则表示后面的元素不管如何搭配都不可能等于0,可以直接跳出循环

。重复元素则跳过,避免出现重复答案

。令左指针 j = i + 1、右指针 k = n - 1, a = nums[i] + nums[j] + nums[k], 当j < k 时 执行循环

1.a > 0, 表示右指针元素过大,需k–

2.a < 0,表示左指针元素过小,需j++

3.a == 0, 将三元组添加到ans数组里,使j,k跳过当前重复元素,直到循环结束


代码示例


func threeSum(nums []int) [][]int {
    if len(nums) < 3{
        return nil
    }
    n := len(nums)
    sort.Ints(nums)
    ans := make([][]int, 0)
    for i := 0; i < n - 2; i++{
        if nums[i] > 0{
            break
        }
        if i != 0 && nums[i] == nums[i - 1]{
            continue
        }
        j := i + 1
        k := n - 1
        for j < k {
            a := nums[i] + nums[j] + nums[k]
            if a > 0{
                k--
            }else if a < 0 {
                j++
            }else{
                ans = append(ans, []int{nums[i], nums[j], nums[k]})
                j++
                k--
                for j < k && nums[j] == nums[j - 1]{
                    j++
                }
                for j < k && nums[k] == nums[k + 1]{
                    k--
                }
            }
        }
    }
    return ans
}


8a49dd56f1ab45d69b749dac09017e65.png


复杂度分析


  • 时间复杂度:O(n2) 其中n表示数组长度,每个元素双指针都会遍历一次数组
  • 空间复杂度:O(1) 没有额外的空间
目录
相关文章
|
11月前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
Python
【Leetcode刷题Python】138. 复制带随机指针的链表
LeetCode上题目“138. 复制带随机指针的链表”的Python解决方案,包括两种方法:一种是在每个节点后复制一个新节点然后再分离出来形成新链表;另一种是构建一个字典来跟踪原始节点与其副本之间的映射关系,从而处理新链表的构建。
140 1
|
索引
力扣每日一题 6/17 枚举+双指针
力扣每日一题 6/17 枚举+双指针
100 1
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
|
算法 数据挖掘 Java
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
|
存储 算法 数据挖掘
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
|
存储 算法 数据可视化
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和

热门文章

最新文章