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

白云区网站建设广州新业建设管理有限公司网站

白云区网站建设,广州新业建设管理有限公司网站,vi设计公司深圳,视频直播网站建设题目链接:15. 三数之和 - 力扣(LeetCode) 1.常规解法(会超时) 由于这道题需要排除相同的三元组,则可以先将目标数组从小到大排序,再遍历数组找到每个符合条件的三元组,若结果中不包…

题目链接:15. 三数之和 - 力扣(LeetCode)

1.常规解法(会超时)

由于这道题需要排除相同的三元组,则可以先将目标数组从小到大排序,再遍历数组找到每个符合条件的三元组,若结果中不包含该三元组,就将该结果添加到目标结果中,代码如下:

    public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ret = new ArrayList<>();Arrays.sort(nums);int n = nums.length;for (int i = 0; i < n - 2; i++) {for (int j = i + 1; j < n - 1; j++) {for (int k = j + 1; k < n; k++) {if (nums[i] + nums[j] + nums[k] == 0) {List<Integer> list = new ArrayList<>();list.add(nums[i]);list.add(nums[j]);list.add(nums[k]);if (!ret.contains(list)) {ret.add(list);}}}}}return ret;}

2. 双指针算法

和常规解法一样,我们要先将目标数组从小到大排序,由于要求三数之和等于0,我们可以先固定一个数,只需找到剩下的哪两个数与这个数的和为0,再定义一个顺序表存放三元组。

定义三个指针left,right,p,先将p固定在最后一个数,left在第一个数的位置,right在倒数第二个数的位置,接下来在每一轮循环中,保持p不动,只要移动left和right即可。

当nums[left] + nums[right] + nums[p] > 0,由单调性知,若保持right不动,left右边的数均大于left指向的数,导致三数之和只会越加越大(数组是从大到小排序的),这时就要将right向左移动一位;当nums[left] + nums[right] + nums[p] < 0,由单调性知,若保持left不动,right左边的数均小于right指向的数,导致三个数之和会越加越小,这是就要将left向右移动一位;当nums[left] + nums[right] + nums[p] == 0,就要将这个结果添加到顺序表中,由于最后的结果不允许出现相同的三元组,这时就要去重。

去重:若使用contains判断三元组是否重复,代码就会超时,这时我们就要在nums[left] + nums[right] + nums[p] == 0时,将与left和right指向的数的相同的数去掉,由于这个数组是有序的,那么相同的数就会聚集在一起,只需要使用while循环去重即可;相同的,当left与right相遇时,第一轮循环结束,也去要进行去重操作,将与p指向的数相同的数跳过即可。

优化:当p指向的元素小于0时,由单调性知,p左边的元素均小于0,就不存在三个数之和为0的情况,直接返回结果即可。

流程图与代码如下:

    public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ret = new ArrayList<>();Arrays.sort(nums);int n = nums.length;int p = n - 1;while (p > 1) {int left = 0;int right = p - 1;if (nums[p] < 0) {return ret;}while (left < right) {if (nums[left] + nums[right] + nums[p] < 0) {left++;} else if (nums[left] + nums[right] + nums[p] > 0) {right--;} else {List<Integer> list = new ArrayList<>();list.add(nums[left]);list.add(nums[right]);list.add(nums[p]);ret.add(list);int numLeft = nums[left++];while (nums[left] == numLeft && left < right) {left++;}int numRight = nums[right--];while (nums[right] == numRight && left < right) {right--;}}}int numP = nums[p--];while (nums[p] == numP && p > 1) {p--;}}return ret;}

 希望大家积极指出不足之处

http://www.yayakq.cn/news/288697/

相关文章:

  • 关于信用体系建设的网站开源cms建站系统
  • 最好的网站管理系统ae模板下载网站
  • 嘉兴网站建设品牌升级企业在线
  • 营销型网站报价多域名指向同一网站
  • 上饶市建设监督网站做好网站维护管理
  • 好友介绍网站怎么做上海商标设计
  • 江苏国龙翔建设网站制作网页用什么进行页面布局
  • 陇西网站建设公司wordpress多个导航菜单
  • 免费原创视频素材网站优化公司信息推荐
  • wordpress打开网站打不开网站流量如何增加
  • 做网站需要办什么证件百度网盘网页版入口
  • 12306网站哪个公司做的58建筑人才招聘网
  • 老虎淘客系统可以做网站吗一家专做有机蔬菜的网站
  • 聊城网站优化网络推广晋江论坛兔区
  • 建设旅游网站wordpress主题页面底部编辑
  • 免费php企业网站管理系统杭州淘宝代运营公司十大排名
  • 昆明网站设计多少钱公司主页图片
  • 烟台公司网站定制wordpress登录评论
  • 网站中的搜索框怎么做软件开发专业知识技能
  • 专门做app网站北京做网站公司电话
  • 揭阳专业网站建设wordpress4.9.8安装
  • 免费网站制作报价上海企业战略规划
  • 有做全棉坯布的网站吗wordpress换标题
  • 竣工验收备案表查询网站温州哪里可以做企业网站
  • 网站首页页脚嘉兴seo外包
  • 广州的做淘宝女鞋货源下载数据包的网站网址是多少?手机网页界面设计
  • 装修之家网站襄阳市住房城乡建设部网站
  • 如何自建一个网站平面设计和电商设计
  • 沈阳网站建设推广平台做粘土网站
  • 免费建站系统下载wordpress只能进首页