数据结构与算法-3元组

给一个数组和一个目标值k,从数组中找出3个值,要求这三个数相加后等于目标值k。返回所有符合这个条件的三个值,同时这三个值的字面量要去重,不能一样。
将3元组问题化解成2元组问题。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class C_3Sum {

    public static List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums); // 先排序
        List<List<Integer>> ans = new ArrayList<>();
        for (int i = nums.length-1; i > 1; i--) {
            if(i == nums.length-1 || nums[i] != nums[i+1]) {
                int target = 0 - nums[i];
                List<List<Integer>> lists = twoSum(nums, i - 1, target);
                for (List<Integer> cur : lists) {
                    cur.add(nums[i]);
                    ans.add(cur);
                }
            }
        }

        return ans;
    }

    // nums[0...end]这个范围上,有多少个不同二元组,相加==target,全返回
    // {-2,9}     K = 7
    // {1, 6}
    public static List<List<Integer>> twoSum(int[] nums, int end, int target) {
        List<List<Integer>> ans = new ArrayList<>();
        int L = 0;
        int R = end;
        while (L < R){
            if(nums[L] + nums[R] > target){
                R--;
            }else if(nums[L] + nums[R] < target){
                L++;
            }else{
                if(L == 0 || nums[L-1] != nums[L]){
                    List<Integer> cur = new ArrayList<>();
                    cur.add(nums[L]);
                    cur.add(nums[R]);
                    ans.add(cur);
                }
                L++;
            }
        }

        return ans;
    }

    public static void main(String[] args) {
        //System.out.println("main...");
        int[] nums = {-1,0,1,2,-1,-4};
        List<List<Integer>> lists = threeSum(nums);
        for(List<Integer> cur : lists){
            for(Integer i : cur){
                System.out.print(i+" ");
            }
            System.out.println();
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值