腾讯面试的一道手撕题:给一个单调递增的数组,找出所有满足a+b=

2020-04-09  本文已影响0人  dev_winner

前言:

正文

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        // 给一个单调递增的数组(无重复元素),找出数组中所有满足a+b=c的三个元素。
        int[] nums = new int[] { 3, 5, 8, 9, 12, 21, 27 };
//      for (int i = 0; i < 5; i++)
//          nums[i] = i;
        List<List<Integer>> list1 = new ArrayList<List<Integer>>();
        List<List<Integer>> list2 = new ArrayList<List<Integer>>();
        // 暴力
        Arrays.sort(nums);
        for (int i = 0, len = nums.length; i < len - 2; i++) {
            for (int j = i + 1; j < len - 1; j++) {
                for (int k = j + 1; k < len; k++) {
                    if (nums[i] + nums[j] == nums[k]) {
                        list1.add(Arrays.asList(nums[i], nums[j], nums[k]));
                        break;
                    }
                }
            }
        }
        // 逆序固定右端点i,然后双指针在[0, i - 1]移动
        for (int i = nums.length - 1, lt, rt, twoSum; i >= 2; i--) {
            lt = 0;
            rt = i - 1;
            while (lt < rt) {
                twoSum = nums[lt] + nums[rt];
                if (twoSum > nums[i])
                    rt--;
                else if (twoSum < nums[i])
                    lt++;
                else {
                    list2.add(Arrays.asList(nums[lt], nums[rt], nums[i]));
                    lt++;
                    rt--;
                }
            }
        }
        System.out.println(list1);
        System.out.println(list2);
    }
}

后记

上一篇 下一篇

猜你喜欢

热点阅读