作者:disappearedgod
时间:2014-9-15
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
想法
代码
别人代码
public class ThreeSumSolution2 {
private ArrayList<ArrayList<Integer>> list;
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
list = new ArrayList<ArrayList<Integer>>();
Arrays.sort(num);
int i = 0;
for (i = 0; i <= num.length - 3; i++) {
if (i != 0 && num[i] == num[i - 1]) {
continue;
}
judgeAndPut(num, i, i + 1, num.length - 1);
}
return list;
}
private void judgeAndPut(int[] num, int i, int p, int q) {
while (p < q) {
if (num[p] + num[q] < -num[i]) {
p++;
} else if (num[p] + num[q] > -num[i]){
q--;
} else if (num[p] + num[q] == -num[i]) {
ArrayList<Integer> tmpList = new ArrayList<Integer>();
tmpList.add(num[i]);
tmpList.add(num[p]);
tmpList.add(num[q]);
list.add(tmpList);
p++;
q--;
while (p < q && num[p] == num[p - 1]) {
p++;
}
while (p < q && num[q] == num[q + 1]) {
q--;
}
}
}
}
}
结果
超时代码
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum1(int[] num) {
int length = num.length;
//List<Integer> list = new ArrayList<Integer>();
ArrayList<ArrayList<Integer>> retlist = new ArrayList<ArrayList<Integer>>();
Arrays.sort(num);
if(length < 3)
return retlist;
for(int i = 0; i < length; i++){
for(int j = length-1; j > i; j--){
int target = 0 - num[i] - num[j];
int pos = biSearch(num, i, j, target);
if(pos != -1){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(num[i]);
list.add(num[pos]);
list.add(num[j]);
retlist.add(list);
}
}
}
return retlist;
}
public int biSearch(int[] a, int low, int high, int target){
int mid = 0;
while(low < high){
mid = low + (high - low) >> 1;
if(a[mid] == target)
return mid;
else if(a[mid] < target){
low = mid +1;
}
else{
high = mid - 1;
}
}
return -1;
}
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
int length = num.length;
//List<Integer> list = new ArrayList<Integer>();
ArrayList<ArrayList<Integer>> retlist = new ArrayList<ArrayList<Integer>>();
Map<Integer,Integer> m = new HashMap<Integer,Integer>();
if(length < 3)
return retlist;
Arrays.sort(num);
for(int i = 0; i < length; i++){
m.put(0-num[i], num[i]);
}
for(int i = 2; i < length; i++){
for(int j = 0; j < i; j++){
if(m.containsKey(num[i] + num[j]))
{
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(num[j]);
list.add(num[i]);
list.add(Integer.valueOf(m.get(num[i]+num[j])));
retlist.add(list);
}
}
}
return retlist;
}
}