【leetcode with java】18 4Sum (On^2),leetcode4sum

來源:互聯網
上載者:User

【leetcode with java】18 4Sum (On^2),leetcode4sum

我看了幾個人氣比較高的部落格,他們這個演算法都沒做到O(n^2),所以提前將我的解法貼出來分享,供大家參考(前面略過的題目近期都會補上的)。


【題目】:

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, a ≤ b ≤ c ≤ d)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)
Tags: Array Hash Table Two Pointers

【解析】 我寫代碼的時候把思路寫在了代碼注釋裡了,請直接往下看:


【上碼】

import java.util.ArrayList;import java.util.Collections;import java.util.Enumeration;import java.util.Hashtable;import java.util.List;import java.util.Vector;/* * 參考:未參考他人演算法 * O(n^2) * 思路:先將每對數塞進一個Hashtable(以這對數的和為key,以一個包含所有和為key的數對的集合為value)。 * 然後遍曆該Hashtable,對於每個和為key的數對集合,在該Hashtable中get和為target-key的數對集合, * 如果get到的為空白,則continue,如果get到的不為空白,則將這兩個數對和並為一個有序4元組,並查看是否之前該 * 4元組是否已經出現過(用另一個Hastable<String,AnyType>:reappear來快速判斷,該reappear的 * key是用有序4元組的4個整數拼接而來的)。 如果該4元組為出現過,則將其加入到結果集合裡。 *  */public class Solution1 {public List<List<Integer>> fourSum(int[] num, int target) {List<List<Integer>> list = new ArrayList<List<Integer>>();if (num == null || num.length < 4)return list;int len = num.length;Hashtable<Integer,PairRecoder> prs = new Hashtable<Integer,PairRecoder>(len*len);for (int i = 0; i < len - 1; i++) {for (int j = i + 1; j < len; j++) {int sum = num[i]+num[j];PairRecoder pr = prs.get(num[i]+num[j]);if(pr == null)prs.put(sum, new PairRecoder(sum,i,j));elsepr.pairs.add(new Pair(i,j));}}List<Four> fours = new ArrayList<Four>();Hashtable<String,Boolean> reappear = new  Hashtable<String,Boolean>(); for(Enumeration<PairRecoder> e=prs.elements(); e.hasMoreElements(); ){PairRecoder pr1 = (PairRecoder)e.nextElement();PairRecoder pr2 = prs.get(target-pr1.v);if(pr2 == null)continue;for(int i=0;i<pr1.pairs.size();i++)for(int j=0;j<pr2.pairs.size();j++){Pair p1 = pr1.pairs.elementAt(i);Pair p2 = pr2.pairs.elementAt(j);if(p1.v1!=p2.v1 &&p1.v1!=p2.v2 && p1.v2!=p2.v1 && p1.v2!=p2.v2){Four of = new OrderedFour(num[p1.v1],num[p1.v2],num[p2.v1],num[p2.v2]);StringBuffer sb = new StringBuffer();sb.append(of.num.get(0));sb.append(of.num.get(1));sb.append(of.num.get(2));sb.append(of.num.get(3));if(!reappear.containsKey(sb.toString())){list.add(of.num);System.out.println("new:"+sb);reappear.put(sb.toString(),true);}}}}return list;}class Pair {int v1;int v2;Pair(int v1, int v2) {this.v1 = v1;this.v2 = v2; }}class PairRecoder{int v;Vector<Pair> pairs = new Vector<Pair>();PairRecoder(int v,int i,int j){this.v = v;this.pairs.add(new Pair(i,j));}}class Four{List<Integer> num;Four(int v1,int v2,int v3,int v4){this.num = new ArrayList<Integer>();num.add(v1);num.add(v2);num.add(v3);num.add(v4);}}class OrderedFour extends Four{OrderedFour(int v1,int v2,int v3,int v4) {super(v1, v2, v3, v4);Collections.sort(this.num);}}}




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.