leetCode数组等相关学习

leetCode练习总目录

一、三数之和

/**
  * 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
     *
     */
 public List<List<Integer>> threeSum(int[] nums) {
        ArrayList result = new ArrayList();
        ArrayList<Integer> numList = new ArrayList<>();
        for (int num : nums) {
            numList.add(num);
        }
        List<Integer> sortNum = numList.stream().sorted(
                (o1, o2) -> o1 - o2
        ).collect(Collectors.toList());
        int numSize = sortNum.size();

        Set<Integer> distinct1 = new HashSet<>();
        Set<Integer> distinct2 = new HashSet<>();
        for (int i = 0; i < numSize; i++) {
            //遍历数组
            //左边最小数字
            int minNum = sortNum.get(i);
            //如果已经处理过相同的直接过滤
            if (distinct1.add(minNum)) {
                //最大值偏移量
                int maxIndex = 0;
                for (int j = numSize - 1 - maxIndex; j > i; j--) {
                    //反向遍历最大值
                    int maxNum = sortNum.get(j);
                    //最大值和最小值之差
                    int step = minNum + maxNum;
                    //存在相同的直接不处理
                    if (distinct2.add(maxNum)) {
                        if (step > 0 && step <= Math.abs(minNum)) {
                            //说明需要加小于0的值,从i下一位开始并且需要小于j
                            for (int i1 = i + 1; i1 < j; i1++) {
                                //中间值
                                int mid = sortNum.get(i1);
                                if (step + mid == 0) {

                                    int[] ints = {mid, minNum, maxNum};
                                    result.add(ints);
                                    //这里需判断i和maxIndex是否需要移动
                                    maxIndex++;
                                    break;
                                } else if (step + mid > 0) {
                                    break;
                                }
                            }

                        } else if (step <= 0 && Math.abs(step) <= maxNum) {
                            //说明需要加大于0的值,从i下一位开始并且需要大于j
                            for (int i1 = j - 1; i1 > i; i1--) {
                                //中间值
                                int mid = sortNum.get(i1);
                                if (step + mid == 0) {
                                    int[] ints = {mid, minNum, maxNum};
                                    result.add(ints);
                                    //这里需判断i和maxIndex是否需要移动
                                    maxIndex++;
                                    break;
                                } else if (step + mid < 0) {
                                    break;
                                }
                            }
                        }
                    }
                }
                distinct2.clear();
            }
        }

        return result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值