【Hot100】15.三数之和

解法:排序 + 双指针

  • 首先对数组排序,便于后面处理重复元素。
  • 第一层循环遍历数组中的每一个元素,作为三元组中的第一个元素 nums[i] ,并跳过重复的元素。
  • 对于每个 i ,使用双指针 l (初始为 i+1)和 r (初始为数组末尾),在 i 之后的区间寻找满足 nums[l]+nums[r] 等于 -nums[i]。
  • 根据双指针指向的两数之和与目标值( -nums[i] )的大小关系:如果相等,将对应的三元组添加到结果数组中,移动指针,并跳过重复元素;如果小于target,左指针 l 右移;如果大于target,右指针 r 左移。
Go 复制代码
func threeSum(nums []int) [][]int {
    sort.Ints(nums)
    result := [][]int{}
    length:=len(nums)
    for i := 0;i<length;i++{
        //跳过重复元素
        if i>0&&nums[i]==nums[i-1]{
            continue
        }
        target:=-nums[i]
        l,r:=i+1,length-1
        for l<r {
            sum := nums[l]+nums[r]
            if sum == target {
                result=append(result,[]int{nums[i],nums[l],nums[r]})
                l++
                r--
                //跳过重复元素
                for l<r && nums[l]==nums[l-1]{ l++ }
                for l<r && nums[r] == nums[r+1]{ r-- }
            }else if  sum<target {
                l++
            }else{
                r--
            }
        }
    }
    return result
}

时间复杂度:排序 O(nlogn),循环 O(n2),总体 O(n2)。

空间复杂度:排序 O(logn),result数组排序 O(n2),总体排序 O(n2)。


我一开始的想法:

  • 首先对数组排序,便于后面处理重复元素。
  • 第一层循环遍历数组中的每一个元素,作为三元组中的第一个元素 nums[i] ,并跳过重复的元素。
  • 第二层循环遍历 i 之后的元素作为三元组的第二个数 nums[j],同样跳过重复的元素。
  • 第三层循环遍历 j 之后的元素,找到满足条件的第三个数 nums[m],将对应的三元组添加到结果 result 中,并跳出内层循环。
Go 复制代码
func threeSum(nums []int) [][]int {
    sort.Ints(nums)
    result := [][]int{}
    length:=len(nums)
//解法一
    for i:=0;i<length;i++{
        if i>0 && nums[i] == nums[i-1]{
            continue
        }
        n := -nums[i]
        for j:=i+1;j<length;j++{
            if j>i+1 && nums[j]==nums[j-1]{
                continue
            }
            k:= n-nums[j]
            for index,v := range nums[j+1:] {
                if v == k {
                    m := index+j+1
                    result=append(result,[]int{nums[i],nums[j],nums[m]})
                    break
                }
            }
        }
    }
    return result
}

时间复杂度:排序 O(nlogn),循环O(n3),总体O(n3)。

空间复杂度:排序 O(logn),存储结果的result二维数组O(n2),总体O(n2)

相关推荐
我想吃烤肉肉6 小时前
leetcode-python-1796字符串中第二大的数字
python·算法·leetcode
_不会dp不改名_7 小时前
leetcode_74 搜索二维矩阵
算法·leetcode·矩阵
hansang_IR7 小时前
【题解 | 两种做法】洛谷 P4208 [JSOI2008] 最小生成树计数 [矩阵树/枚举]
c++·算法·dfs·题解·枚举·最小生成树·矩阵树定理
补三补四7 小时前
贝叶斯向量自回归模型 (BVAR)
android·算法·数据挖掘·数据分析·回归
幂简集成explinks8 小时前
GPT-Realtime 弹幕TTS API:低延迟秒开集成实战
人工智能·后端·算法
一只鱼^_9 小时前
365. 水壶问题(详解)
java·javascript·c++·leetcode·线性回归
午彦琳9 小时前
力扣404 代码随想录Day15 第三题
算法·leetcode·职场和发展
Dream it possible!9 小时前
LeetCode 面试经典 150_滑动窗口_串联所有单词的子串(32_30_C++_困难)(滑动窗口:控制起点和滑动距离)
c++·leetcode·面试·滑动窗口
Q741_1479 小时前
C++ 面试高频考点 力扣 35. 搜索插入位置 二分查找 左右端点查找 题解 每日一题
c++·算法·leetcode·面试·二分查找