1. 程式人生 > >LeetCode 18.四數之和

LeetCode 18.四數之和

跟三數之和的解法差不多,只是多了一重for迴圈,現在時間複雜度為O(n^3)。


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

public class LeetCode18 {

    public static void main(String[] args) {
        List<List<Integer>> res = new ArrayList<>();
        res = fourSum(new int[]{1,0,-1,0
,-2,2}, 0); System.out.println("success"); } public static List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> result = new ArrayList<>(); if (nums != null && nums.length > 3) { Arrays.sort(nums); for
(int i = 0; i < nums.length - 3; ) { int stepRes = target - nums[i]; for (int w = i + 1; w < nums.length - 2; ){ int j = w + 1; int k = nums.length - 1; while (j < k) { if
(nums[j] + nums[k] == -nums[w] + stepRes) { List<Integer> list = new ArrayList<>(3); list.add(nums[i]); list.add(nums[w]); list.add(nums[j]); list.add(nums[k]); result.add(list); k--; j++; while (j < k && nums[j] == nums[j - 1]) { j++; } while (j < k && nums[k] == nums[k + 1]) { k--; } } else if (nums[j] + nums[k] > -nums[w] + stepRes) { k--; while (j < k && nums[k] == nums[k + 1]) { k--; } } else { j++; while (j < k && nums[j] == nums[j - 1]) { j++; } } } w++; while (w < nums.length - 2 && nums[w] == nums[w - 1]) { w++; } } i++; while (i < nums.length - 3 && nums[i] == nums[i - 1]) { i++; } } } return result; } }