第三章 哈希表**part02**

第三章 哈希表**part02**

454.四数相加 II

 

题目地址 : https://leetcode.cn/problems/4sum-ii/

 

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

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 ;




               


  }
};

 

 

383.赎金信

 

题目 地址 : https://leetcode.cn/problems/ransom-note/

 

 

class Solution {
public:
   bool canConstruct(string ransomNote, string magazine) {
       int * frequence_Letter_magazine = new  int[26];
       //int * frequence_Letter_ransomNote = int[26];

       int i = 0;

       for( ; i < 26 ; i++ )
      {
           frequence_Letter_magazine[i] = 0;

      }

       /*
       for(i = 0 ; i < 26 ; i++ )
       {
           frequence_Letter_ransomNote[i] = 0;

       }
       */

       

       

       int len_magazine = magazine.length();

       int len_ransomNote = ransomNote.length();

       for(i = 0 ; i < len_magazine ; i++ )
      {
           frequence_Letter_magazine[magazine[i]-'a']++;   //   注意 引索 与 ASCII 之间 的 偏移量
           //cout<<"magazine[i] = "<<magazine[i]<<endl;
      }
       /*
       for(i = 0 ; i < len_ransomNote ; i++ )
       {
           frequence_Letter_ransomNote[magazine[i]]++;

       }
       */

       for(i = 0 ; i < len_ransomNote ; i++ )
      {
           frequence_Letter_magazine[ransomNote[i]-'a']--;
           //cout<<"ransomNote[i] = "<<ransomNote[i]<<endl;

      }

       for(i = 0 ; i < 26 ; i++ )            //   注意 工作 变量 的 (相对) 初始化
      {
           if(frequence_Letter_magazine[i] < 0)
          {
               return 0;
          }


      }

       return 1;




  }
};

 

 

 

15. 三数之和

 

Code_9_merely_Pass

 

Code :

 

class Solution {
public:


   vector<vector<int>> threeSum(vector<int>& nums) {

       vector<vector<int>> Vec_2_Dimention_Return ;

       //unordered_set<int> set_Index ;

       unordered_map<int,int> map_Val_Digit;

       unordered_set<std::string> set_Encode_string;

       sort(nums.begin(),nums.end());
       

       int i = 0 ;

       int len_nums = nums.size();

       if(len_nums<3)
      {
           cout<<"Error threeSum len_nums < 3 "<<endl;
           return Vec_2_Dimention_Return ;
      }

       for(i = 0 ; i < len_nums ; i++ )            // 这里 “ 溢出 ” 了     // 注意 检查 for 语句 的 条件
                                               //也许 这里 的 溢出,把 后边的 数据 全给 冲爆了
      {
           map_Val_Digit.emplace(nums[i],i);
           
      }

       int j = 0 ;

       for( i = 0 ; i < len_nums - 1 ; i++)                //元素可以重复使用,但是元组组合不能重复。
      {
           if( i > 0 && nums[i] == nums[i - 1]  && nums[i + 1] == nums[i] && i < len_nums - 2 && nums[i + 2] == nums[i + 1])
          {
               continue ;

          }
           //cout<<i<<endl;
           for( j = i + 1 ; j < len_nums ; j++)
          {
               
               
               auto iterator = map_Val_Digit.find(-(nums[i] + nums[j]));

                 
               //for( ; iterator != map_Val_Digit.end() ; i++)

               if( iterator != map_Val_Digit.end() )       // 这里 在 之前 已经 滤清 了 重复 元素 // 如需 包含 重复 元素 请 用 循环 遍历
              {
                   if(i != iterator->second && j != iterator->second)
                  {
                       //vector<int> temp_Vec_Input = { iterator->first , i , j};       //注意 这里 需要 放的 是 值 而不是 下标
                       
                       std::string Encode_string = "";

                       std::string str_iterator_first = to_string(iterator->first);

                       if(iterator->first <= nums[i] )
                      {
                           if(iterator->first <= nums[j] )
                          {
                               if(nums[i] <= nums[j] )
                              {
                                   Encode_string += str_iterator_first + "!" + to_string( nums[i]) + "!" +to_string( nums[j]) + "!" + '\0' ;
                              }
                               else
                              {
                                   Encode_string += str_iterator_first + "!" + to_string(nums[j]) + "!" + to_string(nums[i]) + "!" + '\0' ;
                              }

                          }
                           else
                          {
                               Encode_string +=to_string( nums[j]) + "!" + str_iterator_first + "!" +to_string( nums[i]) + "!" + '\0' ;
                          }
                      }
                       else
                      {
                           if(nums[i] <= nums[j] )
                          {
                               if(nums[j] <= iterator->first)
                              {
                                   Encode_string +=to_string( nums[i]) + "!" +to_string( nums[j]) + "!" + str_iterator_first + "!" + '\0' ;

                              }
                               else
                              {
                                   Encode_string +=to_string( nums[i]) + "!" + str_iterator_first + "!" + to_string(nums[j]) + "!" + '\0' ;

                              }
                               
                          }
                           else
                          {
                               Encode_string += to_string( nums[j]) + "!" +to_string( nums[i]) + "!" + str_iterator_first + "!" + '\0' ;
                          }

                      }

                       /*
                       vector<int> temp_Vec_Input = { iterator->first ,nums[i] , nums[j] };

                       sort(temp_Vec_Input.begin() , temp_Vec_Input.end());

                       int len_temp_Vec_Input = temp_Vec_Input.size();

                       int k = 0;

                       

                       for( ;k < len_temp_Vec_Input ; k++)
                       {
                           
                           Encode_string += (to_string(temp_Vec_Input[k]) + "!");
                       }

                       Encode_string += "\0";

                       */


                       //cout<<"i = "<<i<<"   j = "<<j<<endl;
                       //cout<<Encode_string<<endl;

                       set_Encode_string.emplace(Encode_string);
                       

                       //“ 三 元素 ” 排序 后 插入 , 费 重复 哈希表

                  }
                   
              }


          }


      }

       
       unordered_set<std::string>::iterator iterator_set_Encode_string = set_Encode_string.begin();

       for( ; iterator_set_Encode_string != set_Encode_string.end() ; iterator_set_Encode_string ++ )
      {
           //注意 这里 在 之前 测试 时 , 为了 排错 , 暂时 截断 了 (值 得 输入)
           //std::string Source_Str;// = set_Encode_string->second ;
           //std::string Source_Str = *set_Encode_string ;   //注意 这里的文本错误 上面是用的iterate 而这里 没有加 然后就出了问题
           //cout<<*set_Encode_string<<endl;               //还是 要 排除 积累经验 的 , 进行 探索 、总结 问题 的 排错 是 (相对) 有意义的
           std::string Source_Str = *iterator_set_Encode_string ;

           //cout<<*iterator_set_Encode_string<<endl;

           std::string Cache_Str = "";
           int k = 0;

           int Cache_Num ;

           vector<int> temp_Vec_Output ;

           while(Source_Str[k]!='\0')
          {
               if(Source_Str[k] != '!')
              {
                   Cache_Str += Source_Str[k];

              }
               else
              {
                   Cache_Str += '\0';

                   Cache_Num = stoi(Cache_Str);
                   
                   Cache_Str = "";

                   temp_Vec_Output.push_back(Cache_Num);


              }

               k++;
          }
           Vec_2_Dimention_Return.push_back(temp_Vec_Output);

           temp_Vec_Output.clear();

      }
       

       return Vec_2_Dimention_Return;

  }
};
 

 

posted @ 2023-12-07 00:24  晴夜空  阅读(12)  评论(0)    收藏  举报