LeetCode 454 4Sum II

題目

Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero.

To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of -228 to 228 - 1 and the result is guaranteed to be at most 231 - 1.

Example:

Input:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]

Output:
2

Explanation:
The two tuples are:
(0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
(1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0


解法思路(一)

  • 用四重循環(huán),做一個(gè) O(N4) 的解法,在 5004 的數(shù)量級(jí)的情況下肯定是跑不完的;
  • N = 500 的話,用 O(N2) 的時(shí)間復(fù)雜度的解法去跑是可行的;
如何實(shí)現(xiàn)一個(gè) O(N2) 的解法呢?
  • 如果把 C 和 D 兩兩組合之和存進(jìn)一個(gè) HashMap 中,key 是兩兩組合之和,value 是該和出現(xiàn)的次數(shù),這個(gè)動(dòng)作的時(shí)間復(fù)雜度是 O(N2);
  • 那么 A 和 B 的兩兩組合之和去這個(gè) HashMap 中匹配,這個(gè)匹配的動(dòng)作是 O(1) 的,而 A 和 B 的兩兩組合之和是 O(N2) 的,則總的時(shí)間復(fù)雜度是 O(2N2) = O(N2);

解法實(shí)現(xiàn)(一)

時(shí)間復(fù)雜度
  • O(N2);
空間復(fù)雜度
  • O(N2)
關(guān)鍵字

查找表 HashMap 二維將一維 O(N^2) 降 O(1)

package leetcode._454;

import java.util.HashMap;

public class Solution454_1 {

    public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {

        HashMap<Integer, Integer> CDCombination = new HashMap<>(C.length * D.length);
        for (int i = 0; i < C.length; i++) {
            for (int j = 0; j < D.length; j++) {
                int CDAdd = C[i] + D[j];
                if (CDCombination.containsKey(CDAdd)) {
                    CDCombination.put(CDAdd, CDCombination.get(CDAdd) + 1);
                } else {
                    CDCombination.put(CDAdd, 1);
                }
            }
        }

        int combination = 0;
        for (int i = 0; i < A.length; i++) {
            for(int j = 0; j < B.length; j++) {
                int complement = 0 - A[i] - B[j];
                if (CDCombination.containsKey(complement)) {
                    combination += CDCombination.get(complement);
                }
            }
        }

        return combination;
    }

    public static void main(String[] args) {
        int[] A = {1, 2};
        int[] B = {-2, -1};
        int[] C = {-1, 2};
        int[] D = {0, 2};

        int result = (new Solution454_1()).fourSumCount(A, B, C, D);;
        System.out.println(result);
    }

}

返回 LeetCode [Java] 目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,716評(píng)論 0 13
  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 4,092評(píng)論 0 2
  • 1. 關(guān)于診斷X線機(jī)準(zhǔn)直器的作用,錯(cuò)誤的是()。 (6.0 分) A. 顯示照射野 B. 顯示中心線 C. 屏蔽多...
    我們村我最帥閱讀 11,502評(píng)論 0 5
  • Description Given four lists A, B, C, D of integer values...
    Nancyberry閱讀 184評(píng)論 0 0
  • 問(wèn)題: Given four lists A, B, C, D of integer values, comput...
    Cloudox_閱讀 154評(píng)論 0 0

友情鏈接更多精彩內(nèi)容