2013년 12월 7일 토요일

4Sum


	public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
		if (num == null || num.length < 4)
			return new ArrayList<ArrayList<Integer>>();
		Arrays.sort(num);

		return genericSumSorted(num, target, 0, num.length, 4);
	}

	public ArrayList<ArrayList<Integer>> genericSumSorted(int[] num,
			int target, int offSet, int len, int numToSum) {
		int loopMax = len - numToSum + 1;
		ArrayList<ArrayList<Integer>> rv = new ArrayList<ArrayList<Integer>>();

		if (numToSum == 1) {
			for (int i = offSet; i < loopMax; i++) {
				if (num[i] == target) {
					ArrayList<Integer> newSet = new ArrayList<Integer>();
					newSet.add(num[i]);
					rv.add(newSet);
					break;
				}
			}
		} else {
			int lastValue = num[offSet] - 1;
			for (int i = offSet; i < loopMax; i++) {
				if (num[i] == lastValue)
					continue;
				lastValue = num[i];
				int newTarget = target - num[i];

				ArrayList<ArrayList<Integer>> sub = genericSumSorted(num,
						newTarget, i + 1, len, numToSum - 1);
				for (ArrayList<Integer> subDetail : sub) {
					subDetail.add(0, lastValue);
					rv.add(subDetail);
				}
			}
		}
		return rv;
	}


댓글 없음:

댓글 쓰기