【C++刷题】优选算法——哈希表

  1. 两数之和
    在这里插入图片描述
// 解法一
vector<int> twoSum(vector<int>& nums, int target) {
   vector<int> v(nums.size());
    for (int i = 0; i < v.size(); ++i) {
        v[i] = nums[i];
    }
    ranges::sort(v);
    int left = 0, right = v.size() - 1;

    while (left < right) {
        while (left < right && v[right] > target - v[left]) {
            --right;
        }
        while (left < right && v[left] < target - v[right]) {
            ++left;
        }
        if (left < right && v[left] + v[right] == target) {
            break;
        }
    }
    vector<int> ret(2);
    for (int i = 0; i < nums.size(); ++i) {
        if (nums[i] == v[left]) {
            ret[0] = i;
            break;
        }
    }
    for (int i = nums.size() - 1; i >= 0; --i) {
        if (nums[i] == v[right]) {
            ret[1] = i;
            break;
        }
    }
    return ret;
}

// 解法二
unordered_map<int, int> hash;
vector<int> twoSum(vector<int>& nums, int target) {
    for (int i = 0; i < nums.size(); ++i) {
        if (hash.count(target - nums[i]) > 0) {
            return {hash[target - nums[i]], i};
        } else {
            hash[nums[i]] = i;
        }
    }
    return { -1, -1 };
}
  1. 判定是否互为字符重排
    在这里插入图片描述
bool CheckPermutation(string s1, string s2) {
    if (s1.size() != s2.size()) return false;
    vector<int> hash(26);
    for (char c : s1) {
        hash[c - 'a']++;
    }
    for (char c : s2) {
        hash[c - 'a']--;
    }
    for (int e : hash) {
        if (e > 0) {
            return false;
        }
    }
    return true;
}
  1. 存在重复元素
    在这里插入图片描述
unordered_set<int> hash;
bool containsDuplicate(vector<int>& nums) {
    for (int e : nums) {
        if (hash.count(e) > 0) {
            return true;
        } else {
            hash.insert(e);
        }
    }
    return false;
}
  1. 存在重复元素 II
    在这里插入图片描述
unordered_map<int, int> hash;
bool containsNearbyDuplicate(vector<int>& nums, int k) {
    for (int i = 0; i < nums.size(); ++i) {
        if (hash.count(nums[i]) > 0 && i - hash[nums[i]] <= k) {
            return true;
        } else {
            hash[nums[i]] = i;
        }
    }
    return false;
}
  1. 字母异位词分组
    在这里插入图片描述
unordered_map<string, vector<string>> hash;
vector<vector<string>> groupAnagrams(vector<string>& strs) {
    for (string& s : strs) {
        string tmp = s;
        ranges::sort(tmp);
        if (hash.count(tmp) > 0) {
            hash[tmp].push_back(s);
        } else {
            hash[tmp] = { s };
        }
    }
    vector<vector<string>> ret;
    for (auto& e : hash) {
        ret.push_back(e.second);
    }
    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿阿阿顺Yaya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值