中山网站排名,网站如何备案 流程,企业网站建设的申请,营销型网站建设大千给你一个整数数组 nums #xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k #xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请
你返回所有和为 0 且不重复的三元组。
注意#xff1a;答案中不可以包含重复的三元组。
示例 …给你一个整数数组 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 。提示
3 nums.length 3000-105 nums[i] 105 这是一道百度的一面试题
小编第一次面试就是在这里挂的回头想想真的有点可惜
那么咱们说一下解题方案
“输出[[-1,-1,2],[-1,0,1]]”这个关键字眼很重要这个是决定你要返回的值是ListListInteger,是一个嵌套的List集合而不是单个list注意这点非常重要不然你怎么也写不对
ListListInteger ansnew ArrayList(); 首先对数组进行排序使用java自带的排序方法来对数组进行排序
Arrays.sort(nums);
再使用左右指针指向 nums[i]后面的两端数字分别为 nums[L] 和 nums[R]计算三个数的和 sum判断是否满足为 0满足则添加进结果集(注意这个过程需要不断去重)
如果 nums[i]大于 000则三数之和必然无法等于 000结束循环 如果 nums[i] nums[i−1]则说明该数字重复会导致结果重复所以应该跳过 当 sum 0 时nums[L] nums[L1] 则会导致结果重复应该跳过L 当 sum 0 时nums[R] nums[R−1] 则会导致结果重复应该跳过R−− for(int i0;ilen;i){if(nums[i]0){break;}if(i0nums[i]nums[i-1]){continue;}int Li1;int Rlen-1;while(LR){int sumnums[i]nums[L]nums[R];if(sum0){ans.add(Arrays.asList(nums[i],nums[L],nums[R]));while(LRnums[L]nums[L1]) L;while(LRnums[R]nums[R-1]) R--;L;R--;}else if(sum0) L;else if(sum0) R--;}}
最后返回 ListListInteger嵌套数组 完整代码
class Solution {public ListListInteger threeSum(int[] nums) {ListListInteger ansnew ArrayList();int lennums.length;if(numsnull||len3){return ans;}Arrays.sort(nums);for(int i0;ilen;i){if(nums[i]0){break;}if(i0nums[i]nums[i-1]){continue;}int Li1;int Rlen-1;while(LR){int sumnums[i]nums[L]nums[R];if(sum0){ans.add(Arrays.asList(nums[i],nums[L],nums[R]));while(LRnums[L]nums[L1]) L;while(LRnums[R]nums[R-1]) R--;L;R--;}else if(sum0) L;else if(sum0) R--;}}return ans;}
} 声明该思路以及代码转载自力扣用户画手大鹏 画手大鹏个人链接https://leetcode.cn/problems/3sum/