代码随想录算法训练营第十二天|第18题. 四数之和

news/2025/1/16 4:44:17 标签: 算法, 数据结构

文档讲解:代码随想录

难度:有一点点难度

附:寒假继续开始刷题更新刷题记录

passion!!!passion!!!passion!!!

第18题. 四数之和

力扣题目链接(opens new window)

题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]

思路

可以将问题简单化:往期刷过两数之和和三数之和,所以可以尝试将四数之和转换为三数之和,三数之和的解题的一个巧妙思路如下:

为了降低时间复杂程度,可以对一些可以直接排除的元素进行去除:三数之和中如果一个数字大于目标数字,则可以直接去除(由于已知目标是0,故第一个数字不可以大于目标数字)

详细参考以下文档:

代码随想录

第15题. 三数之和

也可以参考本人往期作品中的“三数之和”

代码随想录算法训练营第十一天|383. 赎金信, 15. 三数之和

  1.  由于题目并没有表明该数组是有序k数组,故应先对数组进行排序(sort方法);
  2. 进入循环1.1(k)
  3. 同理,对一些元素直接排除:因为目标的大小正负未知,故应该加一些条件:如果一个数字大于目标,但为了避免出现特殊情况(如num[k]=-4,目标是-10,)应该对该数字和目标进行正负分析并添加验证条件,可以判断   目标数字或num[k]的正负, 最后为代码实现为nums[i] > target && (nums[i] >=0 || target >= 0)
  4. 去除相同的数字(题目要求),因为已经进行了排序,故判断该数字的前(后)即可
  5. 进入循环2.1(i)(2代表为内层,.1代表是内层第一次循环,以下同理)
  6. 进行第二次进入步骤2,3(可以理解为将前两个数字和并为一个整体后,再进行一次判断)
  7. 设置左右指针,左指针为i的下一个元素,右指针为num数组的最后一个元素
  8. 进入循环3.1(判断条件为右指针应该大于左指针)
  9. 求四数之和:sum=num[k]+num[i]+num[left]+num[right],如果sum偏大则将右指针左移动(排序后,右侧数大于左侧),如果sum偏小则将左指针右移动,如果符合则将num[k],num[i],num[left],num[right]计入result数组
  10. 进入循环4.1,4.2再次进行步骤4进行去重
  11. 左右指针都向中移动
  12. 所有循环结束返回result数组
  13. 定义测试部分:

补充

 在Java中,foreach循环也被称为增强型for循环。它可以用来遍历数组、集合或其他类似结构的数据。foreach循环的语法如下:

  for (element_type element : collection) {

  // 循环体

  }

  其中,element_type是集合中元素的类型,element是集合中每个元素的变量名,collection是需要遍历的集合。在循环体中,可以使用element变量来访问当前元素的值。

  下面是一个示例,展示了如何使用foreach循环来遍历一个整型数组:

  int[] numbers = {1, 2, 3, 4, 5};

  for (int number : numbers) {

  System.out.println(number);

  }

  在这个示例中,我们定义了一个整型数组numbers,然后使用foreach循环来遍历这个数组,并在循环体中打印出每个元素的值。输出结果如下:

  除了数组,foreach循环还可以用于遍历其他类型的集合,例如List、Set、Map等。不过需要注意的是,对于Map类型的集合,foreach循环只能遍历其中的键或值,而不能同时访问键和值。

代码如下: 

import java.util.*;

public class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);  // 排序数组
        List<List<Integer>> result = new ArrayList<>();  // 放结果
        for (int k = 0; k < nums.length; k++) {
            // 剪枝处理
            if (nums[k] > target && nums[k] >= 0) {
                break;
            }
            // 去除nums[k]相同的元素
            if (k > 0 && nums[k] == nums[k - 1]) {
                continue;
            }
            for (int i = k + 1; i < nums.length; i++) {
                // 第二级剪枝
                if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {
                    break;
                }
                // 去除nums[i]相同的元素
                if (i > k + 1 && nums[i] == nums[i - 1]) {
                    continue;
                }
                int left = i + 1;
                int right = nums.length - 1;
                while (right > left) {
                    long sum = (long) nums[k] + nums[i] + nums[left] + nums[right];
                    if (sum > target) {
                        right--;
                    } else if (sum < target) {
                        left++;
                    } else {
                        result.add(Arrays.asList(nums[k], nums[i], nums[left], nums[right]));
                        // 对nums[left]和nums[right]去重
                        while (right > left && nums[right] == nums[right - 1]) right--;
                        while (right > left && nums[left] == nums[left + 1]) left++;
                        right--;
                        left++;
                    }
                }
            }
        }
        return result;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums = {1, 0, -1, 0, -2, 2};
        int target = 0;
        List<List<Integer>> results = solution.fourSum(nums, target);
        for (List<Integer> result : results) {
            System.out.println(result);
        }
    }
}


http://www.niftyadmin.cn/n/5824633.html

相关文章

java求职学习day12

1 泛型机制&#xff08;熟悉&#xff09; 1.1 基本概念 &#xff08;1&#xff09;通常情况下集合中可以存放不同类型的元素&#xff0c;是因为将所有对象都看作Object类型放入&#xff0c;因此从集合中取出元素时&#xff0c;也是Object类型&#xff0c;为了表达该元素真实的…

mysql中使用通配符进行过滤

目录 1、使用通配符 &#xff08;1&#xff09;LIKE操作符 &#xff08;2&#xff09;百分号 % 通配符 &#xff08;3&#xff09;下划线 _ 通配符 2、使用通配符的技巧 3、小结 博主用的是mysql8 DBMS&#xff0c;附上示例资料&#xff1a; 百度网盘链接: https://pan.…

使用el-tree根据切割规则切割数据生成树形结构

数据&#xff1a;dataList: [‘10000’, ‘10000001’, ‘10000001001’, ‘20000’, ‘20000002’] 需要的效果&#xff1a;1. 8-3切割的效果 2. 5-3-3切割的效果 <template><div id"app"><el-tree :data"treeData" :props"defa…

linux手动安装mysql5.7

一、下载mysql5.7 1、可以去官方网站下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包&#xff1a; https://downloads.mysql.com/archives/community/ 2、在线下载&#xff0c;使用wget命令&#xff0c;直接从官网下载到linux服务器上 wget https://downloads.mysql.co…

【微服务】面试 4、限流

微服务限流技术总结 一、微服务业务面试题引入 在微服务业务面试中&#xff0c;限流是重要考点&#xff0c;常与分布式事务、分布式服务接口幂等解决方案、分布式任务调度等一同被考查。面试官一般会询问项目中是否实施限流及具体做法&#xff0c;回答需涵盖限流原因、采用的方…

C# 中对 Task 中的异常进行捕获

以下是在 C# 中对 Task 中的异常进行捕获的几种常见方法&#xff1a; 方法一&#xff1a;使用 try-catch 语句 你可以使用 try-catch 语句来捕获 Task 中的异常&#xff0c;尤其是当你使用 await 关键字等待任务完成时。 using System; using System.Threading.Tasks;class …

AI知识-TF-IDF技术(Term Frequency-Inverse Document Frequency)

摘要 TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种常见的统计方法&#xff0c;用于评估一个词对于一个文档集或一个语料库中的其中一份文档的重要性。本文将全面阐述TF-IDF的通俗理解、技术原理、应用场景&#xff0c;并做以总结。 通俗理…

MYSQL学习笔记(一):准备数据和数据库的最基本命令

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇是入门准备数据和一些关于数据库的操作命令&#xff1b;虽然MYSQL命令很多&…