LeetCode【923】三数之和的多种可能性

题目:
LeetCode【923】三数之和的多种可能性_第1张图片
思路:
https://www.jianshu.com/p/544cbb422300

代码:

int threeSumMulti(vector<int>& A, int target) {
    //Leetcode923:三数之和的多钟可能
    //initialize some const
    int kMod = 1e9 + 7;
    int kMax = 100;
    
    //calculate frequency
    vector<long> freq(kMax + 1, 0);
    for (int a : A){
        freq[a]++;
    }
    
    long ans = 0;
    
    //for different condition calculate the result and add together
    for (int i = 0; i <= target; i++){
        for (int j = i; j <= target; j++){
            int k = target - i -j;
            //checkt whether the value k is legal
            if (k < 0 || k >= freq.size()|| k < j) continue;
            //check whether the number exits in A
            if (!freq[i]||!freq[j]||!freq[k]) continue;
            
            //condition 1
            if((i == j)&&(j == k)){                                 // 都相等,
                ans += freq[i] * (freq[i] - 1) * (freq[i] - 2)/6;   // 猜想,全排列第一个数概率x 第二个数概率x-1,第三个数x-2;为了去重还需要除以 3!= 3 * 2 *1  
            }
            //condition2
            else if((i == j)&& (j != k)){
                ans += freq[k] * freq[i] * (freq[i] - 1) /2;  // 这里两个数重复,除以 2! = 2* 1
            }
            //condition 3
            else if ((i != j) && (j == k)){
                ans += freq[i] * freq[j] * (freq[j] - 1) /2;
            }
            //condition 4
            else {
                ans += freq[i] * freq[j] * freq[k];
            }
        }
    }
    return ans%kMod;

}

你可能感兴趣的:(leetcode,算法,职场和发展)