`
testforvln
  • 浏览: 18976 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论
  • superich2008: 1、去重可以用Set集合2、在排序后,相邻2个元素如果相同可以 ...
    4Sum

3sum

阅读更多
一直没看清英文题目,导致各种WA!唉唉唉。。。
通过Judge Small后:
public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        int length = num.length;
        ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> list;
        for (int i = 0; i < length - 2; ++i)
            for (int j = i + 1; j < length - 1; ++j)
                for (int k = j + 1; k < length; ++k){
                    int sum = num[i] + num[j] + num[k];
                    if (sum == 0){
                        list = new ArrayList<Integer>();
                        list.add(num[i]);
                        list.add(num[j]);
                        list.add(num[k]);
                        Collections.sort(list);
                        if (!results.contains(list))
                            results.add(list);
                    }
                        
                } 
        return results; 
    }
}

尝试O(N2)算法
public class Solution {
    	public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
    		int length = num.length;
			ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
			ArrayList<Integer> list;
			ArrayList<Integer> input = new ArrayList<Integer>();
			for (int i = 0; i < length; ++i)
				input.add(num[i]);
			Collections.sort(input);
			
			HashMap<Integer, ArrayList<ArrayList<Integer>>> map = new HashMap<Integer, ArrayList<ArrayList<Integer>>>();
			for (int i = 1; i < length - 1; ++i)
				for (int j = i + 1; j < length; ++j){
					//ArrayList<ArrayList<Integer>> tempBucket = new ArrayList<ArrayList<Integer>>();
					int sum = input.get(i) + input.get(j);
					ArrayList<Integer> tempBucket = new ArrayList<Integer>();
					tempBucket.add(i);
					tempBucket.add(j);
					tempBucket.add(input.get(i));
					tempBucket.add(input.get(j));
					if (map.containsKey(sum))
						map.get(sum).add(tempBucket);
					else{
						ArrayList<ArrayList<Integer>> tempList = new ArrayList<ArrayList<Integer>>();
						tempList.add(tempBucket);
						map.put(sum, tempList);
					}
				}
			
			for (int i = 0; i < length - 1; ++i)
				for (int sum: map.keySet())
					if (input.get(i) + sum == 0){
						ArrayList<ArrayList<Integer>> tempList = map.get(sum);
						for (ArrayList<Integer> li: tempList)
							if (li.get(0) > i){
								list = new ArrayList<Integer>();
								list.add(input.get(i));
								list.add(li.get(2));
								list.add(li.get(3));
								if (!results.contains(list))
									results.add(list);
							}
					}
			return results;
		}
	}


最后在stackoverflow上找到了答案 唉
http://stackoverflow.com/questions/10732522/difference-between-two-similar-algorithms-of-3sum
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
		Arrays.sort(num);
		HashSet<ArrayList<Integer>> lstSoln = new HashSet<ArrayList<Integer>>();

		ArrayList<Integer> tempArr = null;
		for (int i = 0; i < num.length; i++) {
			int j = i + 1;
			int k = num.length - 1;
			while (j < k) {
				int sum3 = num[i] + num[j] + num[k];
				if (sum3 < 0) {
					j++;
				} else if (sum3 > 0) {
					k--;
				} else {
					tempArr = new ArrayList<Integer>();
					Collections.addAll(tempArr, num[i], num[j], num[k]);
					lstSoln.add(tempArr);
					j++;
					k--;
				}
			}
		}

		return new ArrayList<ArrayList<Integer>>(lstSoln);
	}

第二天想了一下,发现其实还是三重循环,k其实就是j里面的一层循环,只是说看上去变成了两重循环
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics