博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于力扣第十五题 ---三数之和
阅读量:5075 次
发布时间:2019-06-12

本文共 2988 字,大约阅读时间需要 9 分钟。

题目描述:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

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

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[  [-1, 0, 1],  [-1, -1, 2]]

1.暴力解法,低效率

将数组排序 2.定义三个指针,i,j,k。遍历i,那么这个问题就可以转化为在i之后的数组中寻找nums[j]+nums[k]=-nums[i]这个问题,也就将三数之和问题转变为二数之和---(可以使用双指针)时间复杂度O(n^3)

1 var threeSum = function(nums) { 2     nums.sort((a,b)=>{ return a - b })  // 先排序 3     var arr = [], len = nums.length; 4     if(nums === null) return []; 5     if(len < 3) return []; 6     for(var i = 0; i < len - 2; i++){
// 从数组的第二个元素开始,如果该元素和前一个值相同则结果肯定重复;因此需要去重,使用contine直接跳过本次循环进入下一次循环, //(break则彻底破坏结束循环),因为所有元素排序过,所有相同的元素一定是挨着的。 7 if( i > 0 && nums[i] === nums[i-1]) continue; 8 for(var j = i + 1; j < len -1; j++){ // j从当前元素的下一个元素开始取 9 if(j > i + 1 && nums[j] === nums[j-1]) continue;10 for(var k = j + 1; k < len; k++){11 if(k > j + 1 && nums[k] === nums[k-1]) continue;12 if(nums[i] + nums[j] + nums[k] === 0)13 arr.push([nums[i],nums[j],nums[k]]);14 }15 }16 }17 return arr;18 };

2.先排序,再用二分法

1 var threeSum = function(nums) { 2     nums = nums.sort((a,b) => a-b); 3     var res = []; 4     for(var i=0; i
nums[i-1]) { 6 var left = i+1; 7 var right = nums.length - 1; 8 while(left < right) { 9 var s = nums[i]+nums[left]+nums[right];10 if(s == 0) {11 res.push([nums[i],nums[left++],nums[right--]]);12 while(nums[left] == nums[left-1]) {13 left++;14 }15 while(nums[right] == nums[right+1]) {16 right--;17 }18 } else if(s > 0) {19 right--;20 while(nums[right] == nums[right+1]) {21 right--;22 }23 } else {24 left++;25 while(nums[left] == nums[left-1]) {26 left++;27 }28 }29 }30 }31 }32 return res;33 }

 

3.先排序,然后存起来

1 var threeSum = function(nums) { 2      nums=nums.sort(function(a,b){
return a-b}); // 先排序 3 var i=0; 4 var arr=[]; 5 while(i
=0)14 while(nums[k]==c&&j

4.评论区低效率答案

var threeSum = function(nums) {    nums.sort(function(a,b){        return a-b;    })    console.log(nums)    var arr=[]    arr = noZero(nums,arr)    return arr};var noZero=function(nums,a){    var arr = a,flag = false       for(var m =0;m
nums[m-1]){ var i=m+1,l=nums.length-1 while(i
0){ l-- }else { i++ } } } } return arr };

转载于:https://www.cnblogs.com/myfate/p/10413734.html

你可能感兴趣的文章
JavaScript encodeURI() 函数
查看>>
SimpleDateFormat关于时间类的一些常用处理
查看>>
遗传算法示例
查看>>
高校表白App-团队冲刺第二天
查看>>
学生信息管理系统--基于jsp技术和MySQL的简单增删改查
查看>>
使用cocoscreator + node.js + websocket实现简单的聊天服务
查看>>
什么是预测区间,置信区间与预测区间二者的异同是什么?
查看>>
asp.net (jquery easy-ui datagrid)通用Excel文件导出(NPOI)
查看>>
ubuntuPC机安装JLink驱动
查看>>
快速排序
查看>>
我的第一篇随笔
查看>>
设置Eclipse/MyEclipse中编辑界面点击任何文件后Package Explorer导航自动定位该文件...
查看>>
多阶段决策问题
查看>>
C# write in pdf file
查看>>
jQuery.Pin钉住某个元素
查看>>
[笔记][FPGA]有限状态机FSM学习笔记(三)
查看>>
Hotel Check in & check out
查看>>
数组间赋值
查看>>
nignx配置文件语法高亮
查看>>
。标识符命名规则
查看>>