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;
}
2013년 12월 7일 토요일
4Sum
3Sum Closest
public int threeSumClosest(int[] num, int target) {
if (num == null)
return target;
int len = num.length;
if (len < 3) {
int sum = 0;
for (int i = 0; i < len; i++)
sum += num[i];
return sum;
}
Arrays.sort(num);
return findClosestSumSorted(num, target, 0, len, 3);
}
public int findClosestSumSorted(int[] num, int target, int offSet, int len,
int numToSum) {
int loopMax = len - numToSum + 1;
if (numToSum == 1) {
int prevBestValue = num[offSet];
int prevDiff = Math.abs(target - num[offSet]);
for (int i = offSet + 1; i < loopMax; i++) {
int currentDiff = Math.abs(target - num[i]);
if (currentDiff < prevDiff) {
prevBestValue = num[i];
prevDiff = currentDiff;
} else if (currentDiff > prevDiff)
break;
}
return prevBestValue;
} else {
int prevBestValue = 0, prevDiff = Integer.MAX_VALUE;
int lastValue = num[offSet] - 1;
for (int i = offSet; i < loopMax; i++) {
if (lastValue == num[i])
continue;
lastValue = num[i];
int newTarget = target - num[i];
int findValue = findClosestSumSorted(num, newTarget, i + 1,
len, numToSum - 1);
int currentDiff = Math.abs(newTarget - findValue);
if (currentDiff < prevDiff) {
prevBestValue = num[i] + findValue;
prevDiff = currentDiff;
} else if (currentDiff > prevDiff)
break;
}
return prevBestValue;
}
}
3Sum
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
if (num == null || num.length < 3)
return new ArrayList<ArrayList<Integer>>();
Arrays.sort(num);
return genericSumSorted(num, 0, 0, num.length, 3);
}
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;
}
Longest Common Prefix
public String longestCommonPrefix(String[] strs) {
if (strs == null)
return null;
int len = strs.length;
if (len == 0)
return "";
int shortStrIdx = 0;
int shortStrLen = strs[0].length();
for (int i = 1; i < len; i++) {
int strLen = strs[i].length();
if (strLen < shortStrLen) {
shortStrIdx = i;
shortStrLen = strLen;
} else if (strLen == shortStrLen) {
for (int j = 0; j < strLen; j++) {
if (strs[shortStrIdx].charAt(j) != strs[i].charAt(j)) {
shortStrLen = j;
break;
}
}
if (shortStrLen == 0)
return "";
}
}
for (int i = 0; i < len; i++) {
if (i == shortStrIdx)
continue;
for (int j = 0; j < shortStrLen; j++) {
if (strs[shortStrIdx].charAt(j) != strs[i].charAt(j)) {
shortStrLen = j;
break;
}
if (shortStrLen == 0)
return "";
}
}
return strs[shortStrIdx].substring(0, shortStrLen);
}
피드 구독하기:
글 (Atom)