数据结构与算法之二叉树遍历(JavaScript递归实现)
数据结构与算法之深度遍历与广度遍历(DFS&BFS)
数据结构与算法之LeetCode 844. 比较含退格的字符串
LeetCode-1404 将二进制表示减到1的步骤数
LeetCode-653-两数之和IV(利用中序遍历递归求解)

15.三数之和

二分法 先确定一个初始位置
再用下一个位置,与最后的位置开始二分搜索
不断向中间搜索确定一个终止位置

/*** @param {number[]} nums* @return {number[][]}*/
var threeSum = function(nums) {let ans = [];const len = nums.length;if(nums == null || len < 3) return ans;nums.sort((a, b) => a - b); // 排序for (let i = 0; i < len ; i++) {if(nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环if(i > 0 && nums[i] == nums[i-1]) continue; // 去重let L = i+1;let R = len-1;while(L < R){const sum = nums[i] + nums[L] + nums[R];if(sum == 0){ans.push([nums[i],nums[L],nums[R]]);while (L<R && nums[L] == nums[L+1]) L++; // 去重while (L<R && nums[R] == nums[R-1]) R--; // 去重L++;R--;}else if (sum < 0) L++; // 和小于0else if (sum > 0) R--; // 和大于0}}        return ans;
};
结果

执行结果:通过
执行用时:160 ms, 在所有 JavaScript 提交中击败了 32.62%的用户
内存消耗:47.6 MB, 在所有 JavaScript 提交中击败了 89.30% 的用户
通过测试用例: 318 / 318

javascript版本会在测试用例中不通过

[-1,0,1,2,-1,-4,-2,-3,3,0,4]

观察主要是何问题

var threeSum= function(nums) {let n = nums.length;nums.sort();let result = [];for(let first=0;first<n;++first){// 需要和上一次的数字不同if(first>0&&nums[first]==nums[first-1]){continue;}// 对应的指针初始指向数组的最右端let third = n-1;let target = -nums[first];// 枚举第二个数for(let second = first+1;second<n;++second){// 需要和上一次的数字不同if(second>first+1&&nums[second]==nums[second-1]){continue;}// 需要保证b的指针在c指针左侧while(second<third&&nums[second]+nums[third]>target){--third;}// 如果指针重合,则随着B后续增加// 就不会有a+b+c=0并且b<c的c出现了 可以退出循环if(second == third){break;}if(nums[second]+nums[third]==target){result.push([nums[first],nums[second],nums[third]])}}}return result;
}

Java版本无此问题

class Solution {public List<List<Integer>> threeSum(int[] nums) {int n = nums.length;Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<List<Integer>>();// 枚举 afor (int first = 0; first < n; ++first) {// 需要和上一次枚举的数不相同if (first > 0 && nums[first] == nums[first - 1]) {continue;}// c 对应的指针初始指向数组的最右端int third = n - 1;int target = -nums[first];// 枚举 bfor (int second = first + 1; second < n; ++second) {// 需要和上一次枚举的数不相同if (second > first + 1 && nums[second] == nums[second - 1]) {continue;}// 需要保证 b 的指针在 c 的指针的左侧while (second < third && nums[second] + nums[third] > target) {--third;}// 如果指针重合,随着 b 后续的增加// 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环if (second == third) {break;}if (nums[second] + nums[third] == target) {List<Integer> list = new ArrayList<Integer>();list.add(nums[first]);list.add(nums[second]);list.add(nums[third]);ans.add(list);}}}return ans;}
}
参考

三数之和

数据结构与算法之LeetCode-15-三数之和相关推荐

  1. [双指针|模拟] leetcode 15 三数之和

    [双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...

  2. LeetCode 15. 三数之和(3Sum)

    15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...

  3. Java实现 LeetCode 15 三数之和

    15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...

  4. LeetCode 15. 三数之和【双指针】

    15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[ ...

  5. LeetCode 15. 三数之和

    题目描述 15. 三数之和 思路 思路1 比较容易想到的就是,求三数之和等于0,可以等价于求两个数的和,然后看这个和的相反数是否在nums里面. 但是 T_T这样的话复杂度太高了,会超时,捂脸,最后三 ...

  6. Leetcode 15.三数之和

    Time: 20190920 Type: Medium 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所 ...

  7. Leetcode 15:三数之和(最详细解决方案!!!)

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

  8. LeetCode 15三数之和16最接近的三数之和

    三数之和(双指针) 题意: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  9. Leetcode 15.三数之和 双指针 or 暴力哈希

    题目链接:传送门 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 暴力+ ...

  10. 2021-5-11 Leetcode 15.三数之和

    1.1我的解法以及考虑到的几点问题 1)数组长度小于3的不用考虑,直接返回 2)暴力法:每一次查找不是自己选择的数字,看一下能否凑成零(但是这样不知道如何去重) 3)拆成一个数字+LC 1.两数之和的 ...

最新文章

  1. linux 五种IO模型 简介
  2. Spring Cloud Alibaba - 05 Nacos 领域模型_NameSpac/Group/Cluster
  3. 如何输出源文件的标题和目前执行行的行数
  4. wlan端口服务器无响应,wlan项目遇到的问题,总结
  5. 华硕服务器主板型号命名规则,常见主板命名规则
  6. 开源的C#组件——RSS.NET
  7. python-列表包字典-根据字典的某一个键的值来进行排序
  8. Android开发与Sequoyah的安装问题
  9. Go 判断元素是否在切片中
  10. AE脚本-关键帧复制粘贴对齐镜像拉伸调节控制工具 Keystone
  11. Hibernate的配置文件配置
  12. powerbi使用说明_Power BI入门教程
  13. 3d打印零件精度的影响
  14. 手机邮箱如何申请注册?163邮箱申请哪个好?
  15. 利用C语言写一个等额本息的还款计算器。
  16. 对数正态随机数c语言程序,对数正态随机数
  17. imac html5播放器,超给力的五款Mac最佳高清音乐播放器
  18. 【USACO 2.1.4】荷斯坦奶牛
  19. C语言网络聊天室——服务器端
  20. 解决报错dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib

热门文章

  1. 如何查看非自己提交的请求的结果
  2. 2007年考研备战时间安排表
  3. WIN10javaJDK8安装教程
  4. 一刀工具箱 - 周公解梦查询工具
  5. Mobx useStrict is not a function
  6. String中截取部分内容
  7. APK 解包之后修改了文件之后重新打包并签名
  8. inkscape如何裁剪_Inkscape如何设置参考线坐标
  9. ip netns 命令(备忘)
  10. 硬汉2奉陪到底.RMVB/619M.国语/中字.2011最新科经典续集 迅雷下载