【每日一题Day266】LC18四数之和 | 排序+双指针

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

四数之和【LC18】

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

  • 0 <= a, b, c, d < n
  • abcd 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

类似题目

排序+双指针
  • 思路

    类似三数之和,先将数组排序,然后固定两个数 n u m s [ a ] , n u m s [ b ] nums[a],nums[b] nums[a],nums[b],然后在区间 [ b + 1 , n − 1 ] [b+1,n-1] [b+1,n1]使用双指针搜索是否有两数之和为 t a r g e t − n u m s [ a ] − n u m s [ b ] target-nums[a]-nums[b] targetnums[a]nums[b],如果有则记录答案;否则根据大小,右移左指针或者左移右指针。

    • 注意去重以及溢出
    • 优化:
      • 判断最小四元组是否大于target,是则break
      • 判断最大四元组是否小于target,实则continue
  • 实现

    class Solution {
        public List<List<Integer>> fourSum(int[] nums, int target) {
            List<List<Integer>> res = new ArrayList<>();
            int n = nums.length;
            Arrays.sort(nums);
            for (int i = 0; i < n - 3; i++){
                if (i > 0 && nums[i] == nums[i - 1]) continue;
                long x = nums[i];
                if (x + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) break;
                if (x + nums[n - 1] + nums[n - 2] + nums[n - 3] < target) continue;
                for (int j = i + 1; j < n - 2; j++){
                    if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                    long sum2 = nums[i] + nums[j];
                    int l = j + 1, r = n - 1;
                    long num = target - sum2;
                    while (l < r){
                        if (nums[l] + nums[r] == num){
                            res.add(Arrays.asList(nums[i], nums[j], nums[l], nums[r]));                       
                            l++;
                            while (l < n && nums[l - 1] == nums[l]){
                                l++;
                            }
                            r--;
                            while (r > l && nums[r + 1] == nums[r]){
                                r--;
                            }
                        }else if (nums[l] + nums[r] > num){
                            r--;
                        }else{
                            l++;
                        }
                    }
                }
            }
            return res;
        }
    }
    
    • 复杂度文章来源地址https://www.toymoban.com/news/detail-568306.html

      • 时间复杂度: O ( n l o g n + n 2 ) O(nlogn+n^2) O(nlogn+n2),其中 n是数组的长度。排序所需的时间复杂度一般为 O ( n l o g n ) O(nlogn) O(nlogn),查找三元组的时间复杂度为 O ( n 3 ) O(n^3) O(n3),因此时间复杂度为 O ( n 3 ) O(n^3) O(n3)
      • 空间复杂度: O ( 1 ) O(1) O(1)

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

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

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

相关文章

  • 【每日一题Day282】LC2681英雄力量 | 排序+数学

    给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的 力量 定义为: i0 , i1 ,… ik 表示这组英雄在数组中的下标。那么这组英雄的力量为 max(nums[i0],nums[i1] ... nums[ik])2 * min(nums[i0],nums[i1] ... nums[ik]) 。 请你返回所有可能的 非空

    2024年02月14日
    浏览(43)
  • 2023-07-15 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]

    2024年02月16日
    浏览(45)
  • 【力扣每日一题】2023.7.15 四数之和

    这题和本月出过的每日一题:两数之和,三数之和类似。 不夸张的说只要把三数之和的代码拿来再套层for循环改改就可以了。 不过我这里还是简单捋一捋思路,题目给一个数组,要求返回所有长度为4,总和为 target 的子数组(不用连续)。 比较容易想到的是暴力解法,直接

    2024年02月16日
    浏览(79)
  • 【算法】排序+双指针——leetcode三数之和、四数之和

    三数之和 (1)排序+双指针   算法思路: 和之前的两数之和类似,我们对暴力枚举进行了一些优化,利用了 排序+双指针 的思路:   我们先排序,然后固定⼀个数 a ,接着我们就可以在这个数后面的区间内,使用之前两数之和使用的算法,快速找到两个数之和和固定的

    2024年02月13日
    浏览(50)
  • 【算法挨揍日记】day04——15. 三数之和、18. 四数之和

      15. 三数之和 https://leetcode.cn/problems/3sum/ 给你一个整数数组  nums  ,判断是否存在三元组  [nums[i], nums[j], nums[k]]  满足  i != j 、 i != k  且  j != k  ,同时还满足  nums[i] + nums[j] + nums[k] == 0  。请你返回所有和为  0  且不重复的三元组。 注意: 答案中不可以包含重复的三元

    2024年02月09日
    浏览(53)
  • 【算法专题--双指针算法】leecode-15.三数之和(medium)、leecode-18. 四数之和(medium)

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 双指针 常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。 对撞指针:一般用于顺序结构中

    2024年04月09日
    浏览(46)
  • 每日一题——三数之和(双指针)

    题目链接 思路 解析函数原型 首先我们来看一下题目给的函数原型: 题目要求我们 返回一个二维数组,数组的行数代表着存在多少个满足条件的三元组,而在本题中,列数规定为3,即每行存储3个元素 在螺旋矩阵中我们已经做过分析, nums就是题目给的整数数组,numsSize就是

    2024年02月07日
    浏览(37)
  • (双指针 ) 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日
    浏览(48)
  • 【每日一题Day168】LC2427公因子的数目 | 模拟

    给你两个正整数 a 和 b ,返回 a 和 b 的 公 因子的数目。 如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。 简单模拟 感谢力扣 今天还要开会 我恨 感觉习惯真的很容易突然改变 前段时间还是看英文题目的 突然每一天就没有看英文题了 然后这个习惯就没有了

    2023年04月08日
    浏览(40)
  • 【每日一题Day222】LC1110删点成林 | dfs后序

    给出二叉树的根节点 root ,树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。 返回森林中的每棵树。你可以按任意顺序组织答案。 又是一段瓶颈期 2023/5/30 思路 遍历树时,如果

    2024年02月07日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包