第三章 哈希表* part02*

57 阅读2分钟

第三章 哈希表* part02*

454.四数相加 II

题目地址 : leetcode.cn/problems/4s…

基于 结点(键值对) 的 记录

multimap 基于 红黑树

时间 复杂度 O(log(n))

Code :

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
                // 基础 思路  遍历 
​
                //但 复杂度 有点 大
                multimap<int , int> HashTable_Map_A_Add_B;
                multimap<int , int> HashTable_Map_C_Add_D;
​
                // unordered_map  规定 / 设定  不含 重复 的 键值对
​
                //multimap  设定 可以  含有  重复 的 键值对
​
                int temp_SUM_Two_Varable = 0;
​
                int i = 0 ;
​
                int j = 0 ;
​
                int len = end(nums1) - begin(nums1) ;
​
                int Count_SUM_Equal_0 = 0;
​
                int k = 0 ;
​
                i = 0 ;
                for( ; i < len ; i++ )
                {
                    j = 0 ;
                    for(  ; j < len ; j++ )
                    {
                        //HashTable_Map_A_Add_B[nums1[i] + nums2[j]] ++ ; 
​
                        HashTable_Map_A_Add_B.insert({nums1[i] + nums2[j],1});
​
                        //HashTable_Map_A_Add_B.insert(make_pair<int,int>(nums1[i] + nums2[j],1));
​
                    }
​
                    
​
​
                }
​
​
                i = 0 ;
                for( ; i < len ; i++ )
                {
                    j = 0 ;
                    for(  ; j < len ; j++ )
                    {
                        //HashTable_Map_C_Add_D[nums3[i] + nums4[j]] ++ ; 
​
                        HashTable_Map_C_Add_D.insert({nums3[i] + nums4[j],1});
                        //HashTable_Map_C_Add_D.insert(make_pair<int,int>(nums3[i] + nums4[j],1));
​
                    }
​
​
                }
​
​
                //定义 使用 非 前后 分离 逻辑 支持
​
              
                /////////////////////////
​
                //multimap<int , int>:: iterator it1;
                
                for(auto it1 = HashTable_Map_A_Add_B.begin() , end = HashTable_Map_A_Add_B.end() ;it1 != end  ; it1 = HashTable_Map_A_Add_B.upper_bound(it1->first) )
                {
                    //Count_SUM_Equal_0 += HashTable_Map_A_Add_B->second * (HashTable_Map_C_Add_D[HashTable_Map_A_Add_B->first].count) ;                 
                    //cout<<"it1->first = "<<it1->first<<endl;
​
                    //cout<<"it1->first * -1 = "<<it1->first * -1<<endl;
​
                    //cout<<"HashTable_Map_C_Add_D.count( "<<it1->first<<" * -1) = "<<HashTable_Map_C_Add_D.count( it1->first * -1)<<endl;
​
                    //cout<<"HashTable_Map_A_Add_B.count( "<<it1->first<<" * -1) = "<<HashTable_Map_A_Add_B.count( it1->first )<<endl;
                    // 注意  乘  的  内容
                    
                    Count_SUM_Equal_0 += HashTable_Map_A_Add_B.count( it1->first ) * HashTable_Map_C_Add_D.count( it1->first * -1) ;
​
                }
             
                
​
​
​
                return Count_SUM_Equal_0 ;
​
​
​
​
                
​
​
    }
};

基于 下标 的 记录

unordered_map 基于 哈希表

时间 复杂度 O(1)

Code :

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
                // 基础 思路  遍历 
​
                //但 复杂度 有点 大
                unordered_map<int , int> HashTable_Map_A_Add_B;
                unordered_map<int , int> HashTable_Map_C_Add_D;
​
                // unordered_map  规定 / 设定  不含 重复 的 键值对
​
                //multimap  设定 可以  含有  重复 的 键值对
​
                int temp_SUM_Two_Varable = 0;
​
                int i = 0 ;
​
                int j = 0 ;
​
                int len = end(nums1) - begin(nums1) ;
​
                int Count_SUM_Equal_0 = 0;
​
                int k = 0 ;
​
                i = 0 ;
                for( ; i < len ; i++ )
                {
                    j = 0 ;
                    for(  ; j < len ; j++ )
                    {
                        HashTable_Map_A_Add_B[nums1[i] + nums2[j]] ++ ; 
​
                        //HashTable_Map_A_Add_B.insert({nums1[i] + nums2[j],1});
​
                        //HashTable_Map_A_Add_B.insert(make_pair<int,int>(nums1[i] + nums2[j],1));
​
                    }
​
                    
​
​
                }
​
​
                i = 0 ;
                for( ; i < len ; i++ )
                {
                    j = 0 ;
                    for(  ; j < len ; j++ )
                    {
                        auto index_Correspond = HashTable_Map_A_Add_B.find(-(nums3[i] + nums4[j]) );
                        if( index_Correspond != HashTable_Map_A_Add_B.end()  )
                        {
                          Count_SUM_Equal_0 += HashTable_Map_A_Add_B[-(nums3[i] + nums4[j])];
​
                        }
​
                        //HashTable_Map_C_Add_D[nums3[i] + nums4[j]] ++ ; 
​
                        //HashTable_Map_C_Add_D.insert({nums3[i] + nums4[j],1});
                        //HashTable_Map_C_Add_D.insert(make_pair<int,int>(nums3[i] + nums4[j],1));
​
                    }
​
​
                }
​
​
                //定义 使用 非 前后 分离 逻辑 支持
​
              
                /////////////////////////
​
                //multimap<int , int>:: iterator it1;
                /*
                for(auto it1 = HashTable_Map_A_Add_B.begin() , end = HashTable_Map_A_Add_B.end() ;it1 != end  ; it1 = HashTable_Map_A_Add_B.upper_bound(it1->first) )
                {
                    //Count_SUM_Equal_0 += HashTable_Map_A_Add_B->second * (HashTable_Map_C_Add_D[HashTable_Map_A_Add_B->first].count) ;                 
                    //cout<<"it1->first = "<<it1->first<<endl;
​
                    //cout<<"it1->first * -1 = "<<it1->first * -1<<endl;
​
                    //cout<<"HashTable_Map_C_Add_D.count( "<<it1->first<<" * -1) = "<<HashTable_Map_C_Add_D.count( it1->first * -1)<<endl;
​
                    //cout<<"HashTable_Map_A_Add_B.count( "<<it1->first<<" * -1) = "<<HashTable_Map_A_Add_B.count( it1->first )<<endl;
                    // 注意 你 乘  的  内容
                    
                    Count_SUM_Equal_0 += HashTable_Map_A_Add_B.count( it1->first ) * HashTable_Map_C_Add_D.count( it1->first * -1) ;
​
                }
                
                */
                
​
​
​
                return Count_SUM_Equal_0 ;
​
​
​
​
                
​
​
    }
};