【力扣每日一题】2023.7.15 四数之和

这篇具有很好参考价值的文章主要介绍了【力扣每日一题】2023.7.15 四数之和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目:

【力扣每日一题】2023.7.15 四数之和,力扣每日一题,leetcode,算法,职场和发展

示例:

【力扣每日一题】2023.7.15 四数之和,力扣每日一题,leetcode,算法,职场和发展

分析:

这题和本月出过的每日一题:两数之和,三数之和类似。

不夸张的说只要把三数之和的代码拿来再套层for循环改改就可以了。

不过我这里还是简单捋一捋思路,题目给一个数组,要求返回所有长度为4,总和为 target 的子数组(不用连续)。

比较容易想到的是暴力解法,直接套四层 for 循环,然后用 set(unordered_set)来接收满足条件的数组(用于去重),然后再一顿 for 循环把去重后的结果取出来放到 vector 中返回,没试过这种解法,但是中等题大多不能使用暴力解法,会超时。

我们可以先将原数组直接排序(这里是题目要求返回元素值,如果是要返回数组索引,则不能直接排序,需要有别的操作,以后遇到再详细说),然后数组就从小到大排序了(从大到小也可以)。

我们可以使用两个指针分别指向数组首尾,他们的和如果小于 target ,那么就把左指针右移(由于数组是从小到大排序,因此左指针右移则一定会将双指针之和变大,变得更接近target),如果他们的和大于 target ,那么就把右指针左移(原因同上)。 

【力扣每日一题】2023.7.15 四数之和,力扣每日一题,leetcode,算法,职场和发展

这样,我们就解决了“两数之和”,可是我们这是四数之和呀,其实大差不差,我们只需要固定住四数中的“前两数”,然后再使用双指针来寻找两数之和即可,即在数组开头固定住两个指针a和b。然后使用双指针找到targte减去a和b所指元素之和即可。本题和三数之和不同的地方就在于三数之和只需固定“前一数”,而四数之和多固定一个数而已。

另外就是去重,排序原数组的原因,一是可以使用双指针来寻找 target ,二就是去重。

如果固定的前两数中,有遇到和上一次相同的数则跳过本次循环,例如示例二:

【力扣每日一题】2023.7.15 四数之和,力扣每日一题,leetcode,算法,职场和发展

并且如果双指针所指的元素和上一次所指的元素一致,也是需要跳过的(这一点在下面代码中体现)。

代码+运行结果:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>>res;
        if(nums.size()<4) return res;
        sort(nums.begin(),nums.end());
        int c,d;
        for(int a=0;a<nums.size()-3;a++){
            if(a>0 && nums[a]==nums[a-1]) continue; //去重
            for(int b=a+1;b<nums.size()-2;b++){
                if(b>a+1 && nums[b]==nums[b-1]) continue;   //去重  
                c=b+1,d=nums.size()-1;
                while(c<d){
                    long tempsum=(long)nums[a]+(long)nums[b]+(long)nums[c]+(long)nums[d];
                    if(target==tempsum){
                        res.push_back(vector<int>{nums[a],nums[b],nums[c],nums[d]});
                        //去重  
                        int tc=nums[c],td=nums[d];
                        while(c<d && nums[c]==tc) c++;  
                        while(c<d && nums[d]==td) d--;
                    }else if(target>tempsum){
                        c++;
                    }else{
                        d--;
                    }
                }
            }
        }
        return res;
    }
};

【力扣每日一题】2023.7.15 四数之和,力扣每日一题,leetcode,算法,职场和发展

 文章来源地址https://www.toymoban.com/news/detail-575257.html

到了这里,关于【力扣每日一题】2023.7.15 四数之和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (双指针 ) 15. 三数之和 ——【Leetcode每日一题】

    难度:中等 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j 、 i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 注意 :答案中不可以包含重复的三元组。 示例 1: 输入:nums = [-1,0,1,2,-1,-4] 输出:

    2024年02月09日
    浏览(38)
  • 2023-07-15力扣每日一题

    链接: 18. 四数之和 题意: 一个数组n,一个目标值t,在数组内找四个数字和等于t,求能有多少种组合 解: 0716:一看怎么昨天卡没打,原来昨天做的第一题不是每日一题,麻了 n很小,200,那么 先排序 ,然后弄一个 双指针开双循环 l,r ,确定每个组合的最大数字-数字4和最

    2024年02月16日
    浏览(30)
  • 2023-08-15力扣每日一题

    链接: 833. 字符串中的查找与替换 题意: n组操作,其中第i组: 检查 子字符串 sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。 如果没有出现, 什么也不做 。 如果出现,则用 targets[i] 替换 该子字符串。 所有替换操作必须 同时 发生,这意味着替换操作不应该影响彼此

    2024年02月12日
    浏览(30)
  • 2023-07-08 LeetCode每日一题(三数之和)

    点击跳转到题目位置 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 **注意:**答案中不可以包含重复的三元组。 提示: 3 = nums.length = 3000 -10 5

    2024年02月13日
    浏览(40)
  • 2023/07/01_leetcode每日一题_1. 两数之和

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 一开始审错题了,还以

    2024年02月12日
    浏览(39)
  • 18. 四数之和(力扣LeetCode)

    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 = a, b, c, d n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] + nums[d] == target 你

    2024年02月19日
    浏览(31)
  • 2023-08-20 LeetCode每日一题(判断根结点是否等于子结点之和)

    点击跳转到题目位置 给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。 如果根结点值等于两个子结点值之和,返回 true ,否则返回 false 。 示例 1: 示例 2: 提示: 树只包含根结点、左子结点和右子结点 -100 = Node.val = 100 (1) 直接

    2024年02月12日
    浏览(35)
  • 【每日一题Day266】LC18四数之和 | 排序+双指针

    四数之和【 LC18 】 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且 不重复 的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 = a, b, c, d n a 、 b 、 c 和 d 互不相同 nums[a] + nums[b]

    2024年02月16日
    浏览(30)
  • 2023/07/11_leetcode每日一题_16. 最接近的三数之和

    给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 和三数之和那道题一样,排序加双指针

    2024年02月15日
    浏览(53)
  • Leetcode每日一题:167. 两数之和 II - 输入有序数组(2023.7.8 C++)

    目录 167. 两数之和 II - 输入有序数组 题目描述: 实现代码与解析: 暴力(超时) 双指针 原理思路: 二分 原理思路:         给你一个下标从  1  开始的整数数组  numbers  ,该数组已按   非递减顺序排列   ,请你从数组中找出满足相加之和等于目标数  target  的两

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包