当前位置: 代码网 > it编程>编程语言>Javascript > 09、JS实现:数组三数之和算法的解决方案(一步一步剖析,很详细)

09、JS实现:数组三数之和算法的解决方案(一步一步剖析,很详细)

2024年07月28日 Javascript 我要评论
所以返回值为:[ [ 1, 4, 10 ], [ 1, 5, 9 ], [ 1, 6, 8 ], [ 2, 3, 10 ], [ 2, 4, 9 ], [ 2, 5, 8 ], [ 2, 6, 7 ], [ 3, 4, 8 ], [ 3, 5, 7 ], [ 4, 5, 6 ] ]所以返回值为:[ [ -10, 3, 7 ], [ -6, -2, 8 ], [ -6, -1, 7 ], [ -2, -1, 3 ] ]给定 nums = [2, 3, 5, 6, 11, 15], target = 8;

ⅰ、数组三数之和的算法:

1、题目描述:

2、解题思路:

3、实现代码:

其一、代码为:


// 数组三数之和算法的函数:
const threesum = (nums, target) => {
  let res = []
  let sum = target
  // 将数组元素排序
  nums.sort((a, b) => {
    return a - b
  })

  const len = nums.length
  for (let i = 0; i < len - 2; i++) {
    let j = i + 1
    let k = len - 1

    // 如果有重复数字就跳过
    if (i > 0 && nums[i] === nums[i - 1]) {
      continue
    }

    while (j < k) {
      // 三数之和⼩于 sum 值,左指针右移
      // if (nums[i] + nums[j] + nums[k] < 0) {
      if (nums[i] + nums[j] + nums[k] < sum) {
        j++
        // 处理左指针元素重复的情况
        while (j < k && nums[j] === nums[j - 1]) {
          j++
        }
        // 三数之和⼤于0,右指针左移
        // } else if (nums[i] + nums[j] + nums[k] > 0) {
      } else if (nums[i] + nums[j] + nums[k] > sum) {
        k--
        // 处理右指针元素重复的情况
        while (j < k && nums[k] === nums[k + 1]) {
          k--
        }
      } else {
        // 储存符合条件的结果
        res.push([nums[i], nums[j], nums[k]])
        j++
        k--
        while (j < k && nums[j] === nums[j - 1]) {
          j++
        }
        while (j < k && nums[k] === nums[k + 1]) {
          k--
        }
      }
    }
  }
  return res
}

// 此时的输出结果为:[ [ 1, 4, 10 ], [ 1, 5, 9 ], [ 1, 6, 8 ], [ 2, 3, 10 ], [ 2, 4, 9 ], [ 2, 5, 8 ], [ 2, 6, 7 ], [ 3, 4, 8 ], [ 3, 5, 7 ], [ 4, 5, 6 ] ];
threesum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 15)



    执行  threesum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 15)  函数后代码执行的过程:
    注意:其会先将 nums 数组进行升序排列为:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],target 为: 15;
    

    第一个循环:for (let i = 0; i < len - 2; i++) {}, len = 10, i=0,j=i+1=1, k=len-1=9, sum = 15 的情况:
	    且在 i=0 的情况下,类似 if (i > 0 && nums[i] === nums[i - 1]) {} 的所有判断都是不成立的;
	   		 j          k         nums[i] + nums[j] + nums[k] 与 sum 关系            j++        k--     
			 1    <     9         nums[0]+nums[1]+nums[9] = 1+2+10 < 15               2
			 2    <     9         nums[0]+nums[2]+nums[9] = 1+3+10 < 14               3
			 3    <     9         nums[0]+nums[3]+nums[9] = 1+4+10 = 15               
			 
			 res.push([1,4,10]),res为[[1,4,10]];                                     4         8
			 
			 4    <     8         nums[0]+nums[4]+nums[8] = 1+5+9 = 15      
			 
			 res.push([1,5,9]),res为[[1,4,10],[1,5,9]];                              5         7 
			 
			 5    <     7         nums[0]+nums[5]+nums[7] = 1+6+8 = 15                
			 
			 res.push([1,6,8]),res为[[1,4,10],[1,5,9],[1,6,8]];                      6         6 
			 
			 6    <     6     while (j < k) {} 不成立,循环结束;



    第一个循环:for (let i = 0; i < len - 2; i++) {}, len = 10, i=1,j=i+1=2, k=len-1=9, sum = 15 的情况:
	    且在 i=1 的情况下,类似 if (i > 0 && nums[i] === nums[i - 1]) {} 的所有判断都是不成立的;
	   		 j          k         nums[i] + nums[j] + nums[k] 与 sum 关系                             j++        k--    
	   		 2    <     9         nums[1]+nums[2]+nums[9] = 2+3+10 = 15              
	   		 
	   		 res.push([2,3,10]),res为[[1,4,10],[1,5,9],[1,6,8],[2,3,10]];                            3          8 
	   		 
	   		 3    <     8         nums[1]+nums[3]+nums[8] = 2+4+9 = 15              
	   		 
	   		 res.push([2,4,9]),res为[[1,4,10],[1,5,9],[1,6,8],[2,3,10],[2,4,9]];                     4          7 
	   		 
			 4    <     7         nums[1]+nums[4]+nums[7] = 2+5+8 = 15       
			 
			 res.push([2,5,8]),res为[[1,4,10],[1,5,9],[1,6,8],[2,3,10],[2,4,9],[2,5,8]];             5          6 
			 
			 5    <     6         nums[1]+nums[5]+nums[6] = 2+6+7 = 15        
			 
			 res.push([2,6,7]),res为[[1,4,10],[1,5,9],[1,6,8],[2,3,10],[2,4,9],[2,5,8],[2,6,7]];     6          5 
			     
			 6    <     5     while (j < k) {} 不成立,循环结束;  



    第一个循环:for (let i = 0; i < len - 2; i++) {}, len = 10, i=2,j=i+1=3, k=len-1=9, sum = 15 的情况:
	    且在 i=2 的情况下,类似 if (i > 0 && nums[i] === nums[i - 1]) {} 的所有判断都是不成立的;
	   		 j          k         nums[i] + nums[j] + nums[k] 与 sum 关系                                          j++        k--    
	   		 3    <     9         nums[2]+nums[3]+nums[9] = 3+4+10 > 15              						           	      8
	   		 3    <     8         nums[2]+nums[3]+nums[8] = 3+4+9 > 15              							              7
	   		 3    <     7         nums[2]+nums[3]+nums[7] = 3+4+8 = 15      
	   		         							
	   		 res.push([3,4,8]),res为[[1,4,10],[1,5,9],[1,6,8],[2,3,10],[2,4,9],[2,5,8],[2,6,7],[3,4,8]];          4          6  
	   		 
	   		 4    <     6         nums[2]+nums[4]+nums[6] = 3+5+7 = 15
	   		 
	   		 res.push([3,5,7]),res为[[1,4,10],[1,5,9],[1,6,8],[2,3,10],[2,4,9],[2,5,8],[2,6,7],[3,4,8],[3,5,7]];  5          5  
	   		 
	   		 5    <     5     while (j < k) {} 不成立,循环结束;  



    第一个循环:for (let i = 0; i < len - 2; i++) {}, len = 10, i=3,j=i+1=4, k=len-1=9, sum = 15 的情况:
	    且在 i=3 的情况下,类似 if (i > 0 && nums[i] === nums[i - 1]) {} 的所有判断都是不成立的;
	   		 j          k         nums[i] + nums[j] + nums[k] 与 sum 关系                                                  j++        k--    
	   		 4    <     9         nums[3]+nums[4]+nums[9] = 4+5+10 > 15                                                               8
	   		 4    <     8         nums[3]+nums[4]+nums[8] = 4+5+9 > 15                                                                7
	   		 4    <     7         nums[3]+nums[4]+nums[7] = 4+5+8 > 15                                                                6
	   		 4    <     6         nums[3]+nums[4]+nums[6] = 4+5+7 > 15                                                                5
	   		 4    <     5         nums[3]+nums[4]+nums[5] = 4+5+6 = 15    
	   		                                                             
	   		 res.push([4,5,6]),res为[[1,4,10],[1,5,9],[1,6,8],[2,3,10],[2,4,9],[2,5,8],[2,6,7],[3,4,8],[3,5,7],[4,5,6]];  5          4       
	   		 
	   		 5    <     4     while (j < k) {} 不成立,循环结束;  



    第一个循环:for (let i = 0; i < len - 2; i++) {}, len = 10, i=4,j=i+1=5, k=len-1=9, sum = 15 的情况:
	    且在 i=4 的情况下,类似 if (i > 0 && nums[i] === nums[i - 1]) {} 的所有判断都是不成立的;
	   		 j          k         nums[i] + nums[j] + nums[k] 与 sum 关系            j++        k--  
			 5    <     9         nums[4]+nums[5]+nums[9] = 5+6+10 > 15                         8   
			 5    <     8         nums[4]+nums[5]+nums[8] = 5+6+9 > 15                          7
			 5    <     7         nums[4]+nums[5]+nums[7] = 5+6+8 > 15                          6
			 5    <     6         nums[4]+nums[5]+nums[6] = 5+6+7 > 15                          5
			 5    <     5     while (j < k) {} 不成立,循环结束;  



	第一个循环:for (let i = 0; i < len - 2; i++) {}, len = 10, i=5,j=i+1=6, k=len-1=9, sum = 15 的情况:
	    且在 i=5 的情况下,类似 if (i > 0 && nums[i] === nums[i - 1]) {} 的所有判断都是不成立的;
	   		 j          k         nums[i] + nums[j] + nums[k] 与 sum 关系            j++        k--  
			 6    <     9         nums[5]+nums[6]+nums[9] = 6+7+10 > 15                         8   
			 6    <     8         nums[5]+nums[6]+nums[8] = 6+7+9 > 15                          7
			 6    <     7         nums[5]+nums[6]+nums[7] = 6+7+8 > 15                          6
			 6    <     6     while (j < k) {} 不成立,循环结束;  



	第一个循环:for (let i = 0; i < len - 2; i++) {}, len = 10, i=6,j=i+1=7, k=len-1=9, sum = 15 的情况:
	    且在 i=6 的情况下,类似 if (i > 0 && nums[i] === nums[i - 1]) {} 的所有判断都是不成立的;
	   		 j          k         nums[i] + nums[j] + nums[k] 与 sum 关系            j++        k--  
			 7    <     9         nums[6]+nums[7]+nums[9] = 7+8+10 > 15                         8   
			 7    <     8         nums[6]+nums[7]+nums[8] = 7+8+9 > 15                          7
			 7    <     7     while (j < k) {} 不成立,循环结束;  



	第一个循环:for (let i = 0; i < len - 2; i++) {}, len = 10, i=7,j=i+1=8, k=len-1=9, sum = 15 的情况:
	    且在 i=7 的情况下,类似 if (i > 0 && nums[i] === nums[i - 1]) {} 的所有判断都是不成立的;
	   		 j          k         nums[i] + nums[j] + nums[k] 与 sum 关系            j++        k--  
			 8    <     9         nums[7]+nums[8]+nums[9] = 8+9+10 > 15                         8   
			 8    <     8     while (j < k) {} 不成立,循环结束;



	此时第一个循环就结束了:		
	此时的返回结果 res 为:[[1,4,10],[1,5,9],[1,6,8],[2,3,10],[2,4,9],[2,5,8],[2,6,7],[3,4,8],[3,5,7],[4,5,6]];	   


			 

其二、截图为:

在这里插入图片描述

在这里插入图片描述

ⅱ、小结:

其一、哪里有不对或不合适的地方,还请大佬们多多指点和交流!
其二、若有转发或引用本文章内容,请注明本博客地址(直接点击下面 url 跳转) ,创作不易,且行且珍惜!
其三、有兴趣的话,可以多多关注这个专栏(vue(vue2+vue3)面试必备专栏)(直接点击下面 url 跳转):

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com