当前位置: 首页 > news >正文

蓝桥杯入门即劝退(二十一)三数之和(梦破碎的地方)

欢迎===关注===点赞===评论,共同学习,共同进步!

------持续更新蓝桥杯入门系列算法实例--------

如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流!

你的点赞、关注、评论、是我创作的动力!

-------希望我的文章对你有所帮助--------

💪😳👍

一、题目描述

  给你一个整数数组 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、对于求三数之和需要注意的是返回的是一个元组,且不能重复,因此测试用例必然会出现许多重复的结果,需要在过程中剔除。
2、首先即使用Arrays数组内置排序模块进行升序排序,要求a+b+c=0,且a<b<c;
即a<0,a+b>0,或a+b>0,c<0;
且当a>0时,即不可能有sum为0,直接return掉。
3、采用双指针法,类似于二分查找,将num[0]设置为a,b则是其后一个元素,c为最大的元素。
4、开始二分遍历,首先剔除掉a的重复元素
5、计算sum和,如果sum>0,说明值过大,则right指针左移使得整体值减小以接近0;
      如果sum<0,即值过小,要将left右移动以接近0;
6、当sum恰好为0时,将三个元素加入到列表中;
7、再次对b、c重复值进行剔除,且指针也要相应的移动实现剔除
8、最后返回结果即可。

三、代码实现

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result=new ArrayList<>();Arrays.sort(nums);int sum=0;for (int i=0;i< nums.length;i++){if (nums[i]>0)return result;if (i>0&&nums[i]==nums[i-1])continue;//跳过即剔除int left=i+1;//相当于左边界int rigth= nums.length-1;//相当于右边界while (rigth>left){sum=nums[i]+nums[left]+nums[rigth];if (sum>0)rigth--;else if (sum<0)left++;else {result.add(Arrays.asList(nums[i],nums[left],nums[rigth]));//加入列表while (rigth>left&&nums[rigth]==nums[rigth-1]) rigth--;//剔除重复的cwhile (rigth>left&&nums[left]==nums[left+1]) left++;//剔除重复的brigth--;//再次移动left++;}}}return result;}

发文不易,恳请大佬们高抬贵手!
点赞:随手点赞是种美德,是大佬们对于本人创作的认可!
评论:往来无白丁,是你我交流的的开始!
收藏:愿君多采撷,是大佬们对在下的赞赏!

http://www.lryc.cn/news/18326.html

相关文章:

  • element 下拉框支持搜索并输入
  • JVM详解——垃圾回收
  • spring之集成Mybatis
  • 【面试宝典】准备面试了~集合
  • 华为OD机试真题Python实现【GPU 调度】真题+解题思路+代码(20222023)
  • gcc编译C源程序
  • Tina_Linux_各平台多媒体格式_支持列表_new
  • 归并排序及其应用
  • 【PAT甲级题解记录】1007 Maximum Subsequence Sum (25 分)
  • 华为OD机试真题Python实现【 最小叶子节点】真题+解题思路+代码(20222023)
  • mars3d动态轨迹DynamicRoamLine,如何获取实时运⾏的经纬度
  • jvm常识
  • PHP部署、nginx与PHP的整合、PHP动态添加模块
  • SpringCloud与SpringBoot的版本对应
  • 华为OD机试题,用 Java 解【N 进制减法】问题
  • Linux->进程概念于基本创建
  • 【MySQL】5.7版本解压安装配置
  • c++类对象数据成员和虚函数的内存布局
  • Python 模块和包
  • Java零基础专栏——面向对象
  • 离散无记忆与有记忆信源的序列熵
  • 算法该不该刷?如何高效刷算法?
  • Allegro如何在关闭飞线模式下查看网络连接位置操作指导
  • 啊哈 算法读书笔记 第 1 章 一大波数正在靠近——排序
  • Servlet笔记(5):HTTP请求与响应
  • 信号的运算与变换
  • 【GO】K8s 管理系统项目9[API部分--Secret]
  • ESP32 Arduino EspNow点对点双向通讯
  • Linux SID 开发指南
  • Matlab进阶绘图第2期—线型热图