【附JS、Python、C++题解】Leetcode面试150题(9)——三数之和

一、题目​​​​​

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足:
i!=ji!=kj!= k ,同时还满足:nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

二、思路

  1. 我们要返回的是"所有和为0且不重复的三元组",这是一个数组类型,数组里的每一个元素都是三元组;

  2. 要有三个用于遍历的指针;

  3. 判断条件就两个:

  • i!=ji!=kj!= k
  • nums[i] + nums[j] + nums[k] == 0、
  1. 如果直接遍历,重复次数太多了,如何解决?

【联想到"两数之和Ⅱ"的那道题,因为有了一个"非严格递增"的顺序条件,我们得以简化遍历的过程;在这里也可以借鉴这个思路------创造一个顺序出来】

该题题解见如下文章:
【附JS、Python、C++题解】Leetcode面试150题(7)-CSDN博客

三、代码

① JavaScript

javascript 复制代码
function threeNums(nums){
    nums.sort((a,b)->a-b);
    let res = [];
    let l = nums.length;
    for(let i = 0; i<l-2; i++){
        if(i>0 && nums[i]===nums[i-1]){
            continue;
        }
        let j = i+1;
        let k = l-1;
        while(j<k){
            const sum = nums[i] + nums[j] + nums[k];
            if(sum === 0){
                res.push([nums[i], nums[j], nums[k]]);
                while(j<k && nums[j] === nums[j+1]){
                    j++;
                }
                while(j<k && nums[k] === nums[k-1]){
                    k--;
                }
                j++;
                i--;
            }else if(sum<0){
                j++;
            }
            else{
                K--;
            }
            
        }
    }
    return res;
}

② Python

python 复制代码
def three_sum(nums):
    nums.sort()  # 先对数组进行排序
    res = []
    length = len(nums)

    for i in range(length - 2):
        if i > 0 and nums[i] == nums[i - 1]:
            continue

        j, k = i + 1, length - 1

        while j < k:
            total = nums[i] + nums[j] + nums[k]
            if total == 0:
                res.append([nums[i], nums[j], nums[k]])
                # 避免重复计算
                while j < k and nums[j] == nums[j + 1]:
                    j += 1
                while j < k and nums[k] == nums[k - 1]:
                    k -= 1
                j += 1
                k -= 1
            elif total < 0:
                j += 1
            else:
                k -= 1

    return res

③ C++

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<vector<int>> threeSum(vector<int>& nums) {
    vector<vector<int>> res;
    int length = nums.size();

    // 先对数组进行排序
    sort(nums.begin(), nums.end());

    for (int i = 0; i < length - 2; ++i) {
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }

        int j = i + 1;
        int k = length - 1;

        while (j < k) {
            int total = nums[i] + nums[j] + nums[k];
            if (total == 0) {
                res.push_back({nums[i], nums[j], nums[k]});
                // 避免重复计算
                while (j < k && nums[j] == nums[j + 1]) {
                    ++j;
                }
                while (j < k && nums[k] == nums[k - 1]) {
                    --k;
                }
                ++j;
                --k;
            } else if (total < 0) {
                ++j;
            } else {
                --k;
            }
        }
    }

    return res;
}

四、反思

这道题自己做的时候并没有先进行排序,导致重复的次数很多。下次遇到遍历很复杂的问题,要先进行处理!!

相关推荐
满栀5851 小时前
状态管理:Redux、Vuex、Pinia 核心区别
前端·javascript·typescript
C++ 老炮儿的技术栈2 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
大龄码农有梦想4 小时前
Vue + BPMN.js + Camunda:搭建企业级流程设计器完整实践
javascript·vue.js·流程设计器·bpmn.js·bpmn·流程审批·工作流设计器
Eloudy4 小时前
ReAct 原理简介
前端·javascript·人工智能·react.js·agent·gpu
qz_Serene4 小时前
C++:类和对象(上)
开发语言·c++
ZJU_统一阿萨姆5 小时前
【DSH】如何将 DeepSeek Harness 嵌入生产环境?万字解构 DeepSeek Agent Harness 的运行机制与安全边界
前端·javascript·安全
郝学胜-神的一滴6 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆6 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
hetao17338376 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
夏天一说说6 小时前
API 安全】API-Pentest:基于 JS 分析 + AI Agent 的自动化 API 渗透测试工具实战指南
javascript·人工智能·安全·api