力扣热门100题之三数之和【中等】

news/2025/2/21 7:03:19/

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:
在这里插入图片描述
解法1:三重for循环暴力破解

/*** @param {number[]} nums* @return {number[][]}*/
var threeSum = function(nums) {nums.map(num=>parseInt(num));nums.sort((a,b)=>a-b)let s=[]let s1=[]for(let i=0;i<nums.length;i++){for(let j=i+1;j<nums.length;j++){for(let k=j+1;k<nums.length;k++){if(nums[i]+nums[j]+nums[k]==0){let arr=[nums[i],nums[j],nums[k]].sort((a,b)=>a-b);let str=arr.join("")if(s1.indexOf(str)==-1){s.push(arr);s1.push(str);}}}}}return s
};

执行结果:
在这里插入图片描述


解法2:双指针

/*** @param {number[]} nums* @return {number[][]}*/
var threeSum = function(nums) {if(nums==null||nums.length<3) return [];nums.map(num=>parseInt(num));nums.sort((a,b)=>a-b)let s=[]let left=0;let right=0;for(let i=0;i<nums.length-1;i++){if(nums[i]>0) break;if(i>0&&nums[i]==nums[i-1]){continue;}else{left=i+1;right=nums.length-1;while(left<right){if(nums[i]+nums[left]+nums[right]>0){//太大了 right--;}else if(nums[i]+nums[left]+nums[right]<0){//有点小left++;}else{s.push([nums[i],nums[left],nums[right]]);while(left<nums.length-1&&nums[left++]==nums[left+1]){}while(right>left&&nums[right--]==nums[right]){}}}}}return s
};

在这里插入图片描述
解法3:动态规划算法

/*** @param {number[]} nums* @return {number[][]}*/
let s=[]
let tmp=[0,0,0];
let usedIndex=[-1,-1,-1];
let str=[]
let numss=[]
var threeSum = function(nums) {if(nums==null||nums.length<3) return [];s=[]tmp=[0,0,0];usedIndex=[-1,-1,-1];str=[]nums.map(num=>parseInt(num));nums.sort((a,b)=>a-b)numss=nums;dfs(0)return s
};
function dfs(p){if(p==3){tmp=[numss[usedIndex[0]],numss[usedIndex[1]],numss[usedIndex[2]]]if(tmp[0]+tmp[1]+tmp[2]==0){tmp.sort((a,b)=>parseInt(a)-parseInt(b))let s1=tmp.join("")if(str.indexOf(s1)==-1){s.push([tmp[0],tmp[1],tmp[2]])str.push(s1)}}return}for(let i=0;i<numss.length;i++){if(usedIndex.indexOf(i)==-1){usedIndex[p]=i;            dfs(p+1);}}
}

在这里插入图片描述


http://www.ppmy.cn/news/973725.html

相关文章

微信小程序使用讯飞接口语音识别

之前看过网上其他几位使用讯飞的接口来做微信小程序的。在自己实际跟着别人的博客做的时候&#xff0c;却又会遇到一些问题。所以在此对使用讯飞接口做一个总结。这里我是用WebAPI来做。1. 申请科大讯飞的接口 科大讯飞的官方网站 进入官网之后&#xff0c;登陆账号&#xff…

Android科大讯飞语音集成,非常详细的使用讲解

讯飞语音开发集成地址http://www.xfyun.cn/ 解压后的doc文件夹下的msc develop 文件中有详细集成步骤 AppId: 1.先要注册开发者账户, 添加我的应用 , 下载sdk 2.下载后将sdk解压, 把案例导入工程中运行看看效果 3.将libs下的两个jar包添加到libs目录下, 将同路径下的其它 …

tp中如何调用科大讯飞的语音转写

1.首先注册科大讯飞&#xff08;https://www.xfyun.cn/&#xff09;&#xff0c;拿到语音转写的APPID以及SecretKey 2.将我的压缩包放到tp的扩展类库目录&#xff08;extend&#xff09;中。解压 3.在控制里面的调用方式 重点注意&#xff1a; 1.一定要是科大讯飞语音转写的A…

为什么学习SpringSpring框架核心与设计思想(IOC与DI)?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 目录 文章目录 一、Spring是什么&#xff1f; 二、为什么要学习框架&#xff1f; 三、Spring核心概念 3.1 什么是容器&#xff1f; 3.2 什么是IOC&#xff1f; 四、再谈Spring中的 IOC 五…

移动开发-语音识别-调用讯飞平台提供的API

1 登录讯飞平台&#xff0c;申请账号&#xff0c;创建一个应用 具体步骤可以百度查找 2 进入“我的应用”&#xff0c;下载相应的SDK文件 选择语音听写&#xff08;流式版&#xff09;-> Android MSC 3 打开安卓&#xff0c;新建项目 创建一个EditText和一个Button &…

讯飞语音合成andriod版本

目录直达 1、成员变量声明2、参数设置3、获取离线资源4、语音合成监听5、调用方法合成语音6、在onCreate中初始化合成对象7、添加一个按钮8、按钮按下监听 在离线命令的基础上&#xff0c;我们可以添加语音合成功能&#xff0c;因为讯飞语音合成于离线命令识别有相同的地方&…

python3讯飞语音识别

#!/usr/bin/python # -*- coding: UTF-8 -*- import urllib.parse, urllib.request #这是python3&#xff0c;原先py2里的urllib2或者其他都包含在了py3的urllib里了&#xff0c; # py3里的urllib里的parse和request一定要这么导入&#xff0c;直接import urllib # 是不行的imp…

uniapp - 接入科大讯飞语音评测

欢迎关注微信公众号&#xff1a;FSA全栈行动 &#x1f44b; 一、简介 科大讯飞语音评测可以对字、词、句、篇章等题型进行多维度评分&#xff08;准确度、流畅度、完整度、声韵调型等&#xff09;&#xff0c;支持中文和英文。最新的流式版使用 webSocket 调用接口&#xff0c…