Java做算法:三数之和
题目:给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。
输入:nums = [-1,0,1,2,-1,-4]
输出:[ [-1,-1,2], [-1,0,1] ]
解答此题的关键思路:用左右指针查找 nums[ i ] 的三元组,左右指针要位于 i 的右边。
详细步骤:
- 创建一个列表存储结果。
- 把数组元素从小到大排序,便于移动双指针和去重。
- 然后 i 遍历数组,遍历到相同的数字(已经查找过这个数的三元组)则跳出本次循环,遍历下一个数,防止找到重复的三元组。
- 设置while循环,查找此数的所有三元组:三个数分别为 nums[ i ], nums[ left ], nums[ right ],计算和。
- 如果和为 0,则添加到列表,并且同时移动左右指针,为了查找此数的其他三元组。写while循环判断如果下一个指针的元素相同,要继续移动到不同为止。
- 如果和小于 0 或大于 0,则分别移动左右指针。
我的代码:
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<nums.length;i++)
{
//如果最小数字大于0,则没有计算的必要了
if(nums[i]>0)
break;
// 如果此数与上一个元素相同,则跳出本轮循环,直到元素不同为止
if(i>0 && nums[i]==nums[i-1])
continue;
int left = i+1; // left必须位于i的右边,防止重复三元组
int right = nums.length-1;
while(left<right)
{
int sum = nums[i]+nums[left]+nums[right];
if(sum==0)
{
result.add(Arrays.asList(nums[i],nums[left],nums[right]));
left++;
right--;
// 移动指针后,要判断移动后的元素是否与上一个相同!!并且要先判断left<right,不然会死循环。
while(left<right && nums[left-1]==nums[left])
{ left++; }
while(left<right && nums[right+1]==nums[right])
{ right--; }
}
// 如果和小于0,则移动左指针;大于0,则移动右指针。目的是让指针遍历完剩下的元素。
else if(sum<0)
{
left++;
}
else
{
right--;
}
}
}
return result;
}
Java做算法:三数之和的更多相关文章
- 从三数之和看如何优化算法,递推-->递推加二分查找-->递推加滑尺
人类发明了轮子,提高了力的使用效率. 人类发明了自动化机械,将自己从重复的工作中解脱出来. 提高效率的方法好像总是离不开两点:拒绝无效劳动,拒绝重复劳动.人类如此,计算机亦如是. 前面我们说过了四数之 ...
- 南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和
问题 A: 变位词 时间限制: 2 Sec 内存限制: 10 MB提交: 322 解决: 59提交 状态 算法问答 题目描述 请大家在做oj题之前,仔细阅读关于抄袭的说明http://www.bi ...
- leetcode.数组.16最接近的三数之和-java
1. 具体题目 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案 ...
- 【算法训练营day7】LeetCode454. 四数相加II LeetCode383. 赎金信 LeetCode15. 三数之和 LeetCode18. 四数之和
[算法训练营day7]LeetCode454. 四数相加II LeetCode383. 赎金信 LeetCode15. 三数之和 LeetCode18. 四数之和 LeetCode454. 四数相加I ...
- 最接近的三数之和(java实现)
题目: 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如 ...
- Java实现 LeetCode 16 最接近的三数之和
16. 最接近的三数之和 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存 ...
- Java实现 LeetCode 15 三数之和
15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...
- 代码随想录算法训练营day07 | leetcode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
LeetCode 454.四数相加II 分析1.0 这个最直接暴力法,不过过于暴力了,害怕.jpg 失误 读题理解失误:题目要求的是四元组的个数,读完题到我这里成了输出四元组,悲哉 分析2.0 记录有 ...
- LeetCode 16. 3Sum Closest. (最接近的三数之和)
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- LeetCode 三数之和 — 优化解法
LeetCode 三数之和 - 改进解法 题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复 ...
随机推荐
- kubernetes部署1.15.0版本
部署环境 centos7.4 master01: 192.168.85.110 node01: 192.168.85.120 node02: 192.168.85.130 所有节点都要写入hosts ...
- Scroll滚动,你玩明白了嘛?
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- Vim-从放弃到入门
初识Vim Vim被称为神一样的编译器,人类历史上最好文本编辑器(^_^).学习成本很高,学习路线陡峭.下面列举一些入门的教程: 慕课网-玩转Vim 从放弃到爱不释手 新手必看 Vim实用技巧(第2版 ...
- 微信小程序map 动态markers的解决方法
先上效果图 这里演示点击标记点,改变他的气泡背景颜色和字体颜色 1.动态修改数据,需要用到 this.setData(), 2.markers 是一个数组,这里需要涉及setData 修改内部属性的方 ...
- GLSL的预处理器都有哪些规定?
GLSL的预处理器都有哪些规定? 下面的内容,英文版取自GLSLangSpec.4.60.pdf,中文版是我的翻译,只求意译准确易懂,不求直译严格匹配. 3.3. Preprocessor There ...
- QRSuperResolutionNet:一种结构感知与识别增强的二维码图像超分辨率网络(附代码解析)
QRSuperResolutionNet:一种结构感知与识别增强的二维码图像超分辨率网络(附代码解析) 趁着 web开发课程 期末考试前夕,写一篇博客.{{{(>_<)}}} 将我最近所做 ...
- git基础及gitee配置
安装git 网址:https://git-scm.com/book/zh/v2/起步-安装-Git 使用git 基本指令 # 初始化指令 git init # 管理目录下的文件状态 注:新增文件和修改 ...
- 数据分析必备:GPS轨迹、软件签到、手机信令数据获取方式合集
本文对目前主要的出租车.公交车.行人GPS轨迹.社交软件签到.手机信令等数据产品的获取网站加以整理与介绍. 目录 6 GPS轨迹与签到数据 6.1 个人GPS轨迹数据 6.1.1 GeoLife ...
- python爬虫学习——re模块(正则表达式)
正则表达式常用操作符 . 任何单个字符 [] 字符集,对单个字符给出取值范围 [abc].[a-z] [^ ] 非字符集,对单个字符给出排除范围 [^abc] * 对前一个字符0次或无限次拓展 abc ...
- SRv6 验证实验
本文分享自天翼云开发者社区<SRv6 验证实验>,作者:f****n 引言 Segment Routing over IPv6 (SRv6) 是一种基于 IPv6 的新兴网络架构,其通过在 ...