15. 三数之和
Posted sherry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了15. 三数之和相关的知识,希望对你有一定的参考价值。
先看一下两数之和的解:
给一个有序数组,返回组成和为指定值的元组
public static void main(String[] args) { int[] arr={2, 2 ,4, 5 ,9 ,10 ,12}; getPair(arr,14); } public static void getPair(int[] nums,int aim){ if(nums==null||nums.length<2){ return; } int L=0; int R=nums.length-1; while (L<R){ //arr[L]+arr[R]> R-- < L++ if(nums[L]+nums[R]>aim){ R--; }else if(nums[L]+nums[R]<aim){ L++; }else{ if(L==0||nums[L-1]!=nums[L]){//避免重复值 System.out.println("left="+nums[L]+",right="+nums[R]); } L++; R--; } } }
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
class Solution { public List<List<Integer>> threeSum(int[] nums) { // -4 -1 -1 0 1 2 List<List<Integer>> resultList=new ArrayList<>(); if(nums==null || nums.length<3){ return resultList; } Arrays.sort(nums); for(int i=0;i<nums.length-2;i++){ if(nums[i]>0){ return resultList; } if(i>0 && nums[i]==nums[i-1]){ continue; } int target=-nums[i]; int L=i+1; int R=nums.length-1; while(L<R){ if(nums[L]+nums[R]==target){ List<Integer> ans=new ArrayList<>(); ans.add(nums[i]); ans.add(nums[L]); ans.add(nums[R]); resultList.add(ans); L++; R--; while(L<R && nums[L]==nums[L-1]){ L++; } while(L<R && nums[R]==nums[R+1]){ R--; } }else if (nums[L]+nums[R]<target){ L++; }else{ R--; } } } return resultList; } }
以上是关于15. 三数之和的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结