力扣刷题——哈希表

力扣242有效的字母异位词

class Solution {
public:
    bool isAnagram(string s, string t) {
        vector<int>hash(26,0);
        for(int i=0;i<s.length();i++){
            hash[s[i]-'a']++;
        }
        for(int i=0;i<t.length();i++){
            hash[t[i]-'a']--;
        }
        for(int i=0;i<26;i++){
            if(hash[i]!=0) return false;
        }
        return true;
    }
};

力扣349两个数组的交集

本题使用set解决,set分为三种

set,multiset是基于红黑树实现

unorderset是基于哈希映射实现(默认去重)

class Solution {
public:
//如果数的范围大的或者数比较分散,用数组不合适,因为有大量的空闲位置,应该用set
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
          //result存储结果
          unordered_set<int> result;
          //nums1_set存放nums1
          unordered_set<int> nums1_set(nums1.begin(),nums1.end());
          //遍历nums2 并尝试在nums1_set中寻找
          for(int i=0;i<nums2.size();i++){
              //找到了,就放进result
              if(nums1_set.find(nums2[i])!=nums1_set.end()){
                  result.insert(nums2[i]); 
              }
          }
          //因为题目要求返回vector
          vector<int> res(result.begin(),result.end());
          return res;
    }
};

力扣1两数之和

class Solution {
public:
//这道题的哈希表除了存值,还得存下标,只能用map
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        //为啥用元素值做key而不是用map做key?因为find是找key

        //将nums这个vector数组存进num这个map数组
        map<int,int> num;
        for(int i=0;i<nums.size();i++){
            num.insert(make_pair (nums[i], i));//插入键值对
        }
        for(int i=0;i<nums.size();i++){
            if(num.find(target-nums[i])!=num.end()&&i!=num[target-nums[i]]){
                res.push_back(i);
                res.push_back(num[target-nums[i]]);
                break;//找到一对
            }
        }
        return res;
    }
};

力扣202快乐数

class Solution {
public:
//统计每个位置上的数字的平方和
    int getSum(int n){
        int res=0;
        while(n){
            res+=(n%10)*(n%10);
            n/=10;
        }
        return res;
    }
    bool isHappy(int n) {
        unordered_set<int> hash;//判断sum是否重复出现就可以使用unordered_set
        while(n!=1){
            hash.insert(n);
            n=getSum(n);//每一次将该数替换为它每个位置上的数字的平方和
            if(hash.find(n)!=hash.end()) return false;//重复出现说明死循环
        }
        return true;
    }
};

力扣454四数相加

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int,int>num;
        int res=0;
        //先将其中两个数组的和存进map
        //map的key是两个数组的和 value是这个和出现的次数
        for(int i=0;i<nums1.size();i++){
            for(int j=0;j<nums2.size();j++){
                if(num.find(nums1[i]+nums2[j])==num.end())
                     num.insert(make_pair(nums1[i]+nums2[j],1));
                else num[nums1[i]+nums2[j]]++;
            }
        }
        //扫描num3和num4
        for(int i=0;i<nums3.size();i++){
            for(int j=0;j<nums4.size();j++){
                if(num.find(0-nums3[i]-nums4[j])!=num.end()){
                    res+=num[0-nums3[i]-nums4[j]];//注意应该+value而不是+1
                }
            }
        }
        return res;
    }
};

力扣15三数之和

注意去重逻辑

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(),nums.end());
        int left,right;
        for(int i=0;i<nums.size();i++){
            if(nums[i]>0) return res;
            if(i>0&&nums[i]==nums[i-1]) continue;//这是去重的逻辑
            left=i+1;
            right = nums.size()-1;
            while(left<right){
                //如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些
                 if(nums[i]+nums[left]+nums[right]>0){
                     right--;
                 }  
                 //如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止
                 else if(nums[i]+nums[left]+nums[right]<0){
                     left++;
                 }
                 else {
                    //收获结果
                    res.push_back({nums[i],nums[left],nums[right]});
                    //这也是去重的逻辑
                    while(left<right&&nums[left]==nums[left+1]){
                         left++;
                    }
                    while(left<right&&nums[right]==nums[right-1]){
                         right--;
                    }
                    //收获结果并去重后继续判断下一对
                    left++;
                    right--;
                 }
            }
        }
        return res;   
    }
};

四数之和

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        for(int k=0;k<nums.size();k++){
            //剪枝
            if(nums[k]>target&&nums[k]>0&&target>0){
                break;
            }
            //去重
            if(k>0&&nums[k]==nums[k-1]){
                continue;
            }
            for(int i=k+1;i<nums.size();i++){
                //剪枝
                if(nums[k]+nums[i]>target&&nums[k]+nums[i]>0&&target>0){
                    break;
                }
                //去重
                if(i>k+1&&nums[i]==nums[i-1]){
                    continue;
                }

                int left=i+1,right=nums.size()-1;
                while(left<right){
                    if((long)nums[k]+nums[i]+nums[left]+nums[right]<target) left++;
                    else if((long)nums[k]+nums[i]+nums[left]+nums[right]>target) right--;
                    else{
                        //收获
                        res.push_back({nums[k],nums[i],nums[left],nums[right]});
                        //去重
                        while(left<right&&nums[left]==nums[left+1]){
                            left++;
                        }
                        while(left<right&&nums[right]==nums[right-1]){
                            right--;
                        }
                        left++;
                        right--;
                    } 
                }
            }
        }
        return res;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值