力扣18 四数之和(C++)

题目


知识点

剪枝处理

负数处理

举例说明

假设:数组中有负数,比如 -5, -4, -2, 1, 3,target = -10

当前 numsk = -5,情况分析:-5 > -10 成立(因为 -5 确实大于 -10),

但如果没有 numsk >= 0 的限制,我们会直接 break,跳过了后续可能的解

实际上,-5 可以和 -4、-2、1 组合成 -10(-5 + -4 + -2 + 1 = -10)!

为什么需要 >= 0?

负数相加会变得更小:当数组中有负数时,即使当前数已经大于 target,加上后面的负数后,总和可能会变小,仍然可能等于 target。

非负数才具有单调性:只有当数组元素都大于等于 0 时,随着索引增加,和才会单调递增。这样一旦当前数大于 target,后面更大的数相加只会更大,肯定无法等于 target。

去重


思路

和 15 三数之和 都是一样的思路,利用排序+双指针 ,但是要再多加一层for循环


题解

cpp 复制代码
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> result;
        for(int k=0;k<nums.size();k++){
            //一级剪枝处理
            if(nums[k]>=0 && nums[k]>target){
                break;
            }

            //一级去重
            if(k>0 && nums[k]==nums[k-1]){
                continue;
            }

            for(int i=k+1;i<nums.size();i++){
                //二级剪枝处理
                if(nums[k]+nums[i]>=0 && nums[k]+nums[i]>target){
                    break;
                }

                //二级去重
                if(i>k+1 && nums[i]==nums[i-1]){
                    continue;
                }

                int left=i+1;
                int right=nums.size()-1;
                while(left < right){
                    if((long)nums[k]+nums[i]+nums[left]+nums[right]>target) right--;
                    else if((long)nums[k]+nums[i]+nums[left]+nums[right]<target) left++;
                    else{
                        result.push_back(vector<int>{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--;
                    }
                }
            }//for i
        }//for k
        return result;
    }
};
相关推荐
夜不会漫长1 小时前
C++:红黑树
数据结构·算法
文丑颜不良啊1 小时前
LeetCode1661~1680题目解析
java·leetcode
AI备案指南-满满2 小时前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
Ramble_Naylor2 小时前
Rust深度解读:Send 与 Sync 的本质与线程安全边界
python·算法·rust
秋天的怀念_David2 小时前
算法一千零一夜 · 第二十三夜 电力民生写成的曲线
java·程序人生·算法
不一样的故事1262 小时前
NB/T 47013.8-2015 附录D 吸枪技术
人工智能·经验分享·算法
通问AI2 小时前
用 200 行 Python 给文档库做「上下文完整度」自检:四个可复算的检查项
算法
揽星河..3 小时前
【C语言】扫雷游戏
c语言·算法·游戏
丘山录3 小时前
本地部署 LongCat-2.5,要 7 台机器我只有 4 台
人工智能·算法
Allen_LVyingbo3 小时前
NVIDIA CUDA Tile 在医疗计算中的算子形式化、算法重构与内核实现
大数据·python·算法·重构·知识图谱·健康医疗·数据库架构