LeetCode刷题笔记(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:
1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0

题意分析: 

给定四个整数列表A,B,C,D(列表没有特殊指明,应该可以为空集),请计算有多少对 (i, j, k, l) 使得 A[i] + B[j] + C[k] + D[l] 为0,为了使得问题变得简单,A,B,C,D有相同的长度且长度在0到500之间,所有元素在-228到228-1之间,并且结果应保证最大为231-1.

解答如下:

方法一(用unordered_map方法,时间复杂度O(n*n), 空间复杂度O(n*n))

先创建一个unordered_map型的变量record,用于存放A[i] + B[j]的所有元素组合(record最多存放n*n种组合,故空间复杂度O(n*n)),然后在record中查找0-C[k] - D[l]的频次,并将查找到的频次结果进行累加,最后返回累加结果即可。

class Solution {
public:

    int fourSumCount(vector<int> &A, vector<int> &B, vector<int> &C, vector<int> &D) {
        unordered_map<int, int> record;
        int result = 0;
        for (int i = 0; i < A.size(); i++)
            for (int j = 0; j < B.size(); j++) {
                record[A[i] + B[j]]++;
            }
        for (int i = 0; i < C.size(); i++)
            for (int j = 0; j < D.size(); j++)
                if (record.find(0 - C[i] - D[j]) != record.end())
                    result += record[0 - C[i] - D[j]];

        return result;

    }
};

 提交后的结果如下:

方法二(暴力法)

用四层for循环分别遍历A、B、C、D中的所有元素,只要每四个元素之和等于0,则计数变量result++。当然这种方式,运行时间肯定是不理想的。

class Solution {
public:

    int fourSumCount(vector<int> &A, vector<int> &B, vector<int> &C, vector<int> &D) {
        int result = 0;
        for (int i = 0; i < A.size(); i++)
            for (int j = 0; j < B.size(); j++)
                for (int l = 0; l < C.size(); l++)
                    for (int k = 0; k < D.size(); k++)
                        if (A[i] + B[j] + C[l] + D[k]  == 0)
                                result ++;
        return result;

    }
};

  提交后的结果如下:

日积月累,与君共进,增增小结,未完待续。    

猜你喜欢

转载自blog.csdn.net/Vensmallzeng/article/details/87928326