代码随想录 哈希 test 8

18. 四数之和 - 力扣(LeetCode)

        与三数之和类似,重点在剪枝和去重的区别,由于target可正可负,因此需要分两种情况讨论,如果target为正,则若当前选择的元素之和大于target,需要跳出这种选择,如果target为负,则若当前选择的元素之和大于target,需要跳出这种选择,可以将这两种情况简化(不完全相同)为判断当前选择的元素之和大于target且选择的元素之和>=0(目标值为-100,若元素为-99,-1,0也可以成立),去重与之前类似,注意选择第二个元素时同样需要类似的剪枝。

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        for(int j = 0; j < nums.size(); j++){
            if(nums[j] > target && nums[j] >= 0) break;
            if(j > 0 && nums[j] == nums[j-1]) continue;

            for(int i = j + 1; i < nums.size(); i++){
                if(nums[i] + nums[j] > target && nums[i] + nums[j] >= 0) break;
                if(i > j + 1 && nums[i] == nums[i - 1]) continue;

                int l = i + 1, r = nums.size() - 1;
                while(l < r){
                    if((long)nums[j] + nums[i] + nums[l] + nums[r] < target) l++;
                    else if((long)nums[j] + nums[i] + nums[l] + nums[r] > target) r--;
                    else{
                        res.push_back({nums[j],nums[i], nums[l], nums[r]});
                        while(r > l && nums[l + 1] == nums[l]) l++;
                        while(r > l && nums[r - 1] == nums[r]) r--;
                        l++, r--;
                    }
                }
            }
        }
        return res;
    }
};

### 关于哈希表的学习资源 对于希望深入理解哈希表的人来说,代码随想录提供了丰富的学习材料。网站上的哈希表部分不仅涵盖了基础概念,还包含了实际应用案例和解题思路[^1]。 #### 哈希表的基础理论 哈希表是一种基于键值对的数据结构,它允许快速访问数据项。其工作原理是通过特定的哈希函数计算给定键对应的索引位置,并以此来存取关联的数据值。当多个不同的输入映射到相同的输出时会发生冲突,即所谓的哈希碰撞现象。处理这类情况的方法有两种主要方式:拉链法(分离链接)与开放寻址法(如线性探测)。这些基础知识可以在代码随想录有关哈希表的文章中找到详细的解释[^5]。 #### 实战练习与技巧分享 为了更好地掌握哈希表的应用场景和技术细节,在完成理论学习之后可以尝试解答一些经典的算法题目。例如,“有效的字母异位词”,这是一道考察字符串操作能力的好题;还有“快乐数”的求解过程也涉及到循环检测等内容。此外,《学透哈希表》系列课程则更侧重于指导如何高效利用`Map`接口下的各种方法解决问题,比如`getOrDefault()`等实用功能[^4]。 ```java // 使用HashMap.getOrDefault()获取指定key对应value,如果不存在返回默认值 public int getValueOrDefault(Map<String, Integer> map, String key){ return map.getOrDefault(key, 0); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值