Java [leetcode 18]4Sum

问题描述:

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, abcd)
  • The solution set must not contain duplicate quadruplets.
    For example, given array S = {1 0 -1 0 -2 2}, and target = 0.



    A solution set is:

    (-1,  0, 0, 1)

    (-2, -1, 1, 2)

    (-2,  0, 0, 2)

解题思路:

与之前的3sum相类似,只不过在外边多了一套循环,时间复杂度为O(n^3)

代码如下:

public class Solution {

    List<List<Integer>> ans = new ArrayList<List<Integer>>();

	public List<List<Integer>> fourSum(int[] nums, int target) {

		int length = nums.length;

		int tmp;

		if (nums == null || length < 4)

			return ans;

		Arrays.sort(nums);

		for (int i = 0; i < length - 3; i++) {

			if (i > 0 && nums[i] == nums[i - 1])

				continue;

			for (int j = i + 1; j < length - 2; j++) {

				if (j > i + 1 && nums[j] == nums[j - 1])

					continue;

				int begin = j + 1;

				int end = length - 1;

				while (begin < end) {

					tmp = nums[begin] + nums[end] + nums[i] + nums[j];

					if (tmp == target) {

						List<Integer> list = new ArrayList<Integer>();

						list.add(nums[i]);

						list.add(nums[j]);

						list.add(nums[begin]);

						list.add(nums[end]);

						ans.add(list);

						while (begin < end && nums[begin + 1] == nums[begin])

							begin++;

						begin++;

						while (begin < end && nums[end - 1] == nums[end])

							end--;

						end--;

					} else if (tmp > target)

						end--;

					else

						begin++;

				}

			}

		}

		return ans;

	}

}

 

你可能感兴趣的:(LeetCode)