leetcode 15. 三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

 

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

 

比较经典的题目,难点不在于能否找得到,而在于不能包含重复的三元组,首先进行一个排序,这样在每次遍历的时候如果得到一组有效数据,在判断周围是否有相同的数据就变的比较方便了

 算法流程: 1 如果为空或者小于三个元素则返回为空、

2 对数组进行排序。
遍历排序后数组:
若 nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 0,直接返回结果。
对于重复元素:跳过,避免出现重复解
   令左指针 L=i+1,右指针 R=n-1,当 L<R 时,执行循环:
   当 nums[i]+nums[L]+nums[R]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复 解。并同时将 L,R移到下一位置,寻找新的解
   若和大于 0,说明 nums[R] 太大,RR 左移
   若和小于 0,说明 nums[L]太小,LL 右移

public List<List<Integer>> threeSum(int[] nums) {
		
		 List<List<Integer>> list = new ArrayList<>();
		 if(nums.length<3) return list;
		 Arrays.sort(nums);
		 int n = nums.length;
		
		for(int i=0;i<n;i++){
			if(nums[i] >0){
				return list;
			}
			if(i>0 && nums[i] == nums[i-1]){
				continue;
			}
			int cur = nums[i];
			int L = i+1;
			int R = n-1;
			while(L<R){
				int tem = nums[L] + nums[R] + cur;
				if(tem == 0){
					List<Integer> templist = new ArrayList<>();
					templist.add(cur);
					templist.add(nums[L]);
					templist.add(nums[R]);
					list.add(templist);
					while(L<R && nums[L] == nums[L+1]) L++;
					while(L<R && nums[R] == nums[R-1]) R--;
					L++;
					R--;
				}else {
					if(tem < 0){
						L++;
					}else{
						R--;
					}
				}
			}
			
			
		}
		
		
		
		
		return list;

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值