【刷题记录】18. 四数之和

简介: 【刷题记录】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
    你可以按 任意顺序 返回答案 。


示例 1:


输入:nums = [1,0,-1,0,-2,2], target = 0

输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]


示例 2:


输入:nums = [2,2,2,2,2], target = 8

输出:[[2,2,2,2]]


提示:


  • 1 <= nums.length <= 200
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109


二丶思路分析


排序 + 双指针


这个题目 和 【刷题记录】15.三数之和 的思路是一样的,只不过是从三个数,变成了四个数字的处理。


  • 定义 四个 指针 i,j,L,R
  • 在确定两个数 i,j 的情况下,双指针L,R从两边遍历,查找。


三、代码实现

class Solution {
public List<List<Integer>> fourSum(int[] nums, int t) {
        Arrays.sort(nums);
        int n = nums.length;
        List<List<Integer>> res = new ArrayList<>();
        // 确定第一个数
for (int i =0; i < n; i++) {
            // 对第一个数进行去重
if (i > 0 && nums[i] == nums[i -1]) continue;
            // 确定第二个数
for (int j = i +1; j < n; j++) {
                // 对第二个数进行去重
if (j > i +1 && nums[j] == nums[j -1]) continue; 
                // 确定第三个数和第四个数
                int L = j +1;
                int R = n -1;
while (L < R) {
                    // 对第三个数进行去重
while (L > j +1 && L < n && nums[L] == nums[L -1]) L++;
if (L >= R) break;
                    int sum = nums[i] + nums[j] + nums[L] + nums[R];
if (sum == t) {
                        res.add(Arrays.asList(nums[i], nums[j], nums[L], nums[R]));
                        L++;
                    } elseif (sum > t) {
                        R--;
                    } else {
                        L++;
                    }
                }
            }
        }
        return res;
    }
}


复杂度分析


时间复杂度:

网络异常,图片无法展示
|
,其中 n 是数组的长度。排序的时间复杂度是
网络异常,图片无法展示
|
,枚举四元组的时间复杂度是
网络异常,图片无法展示
|
,因此总时间复杂度为
网络异常,图片无法展示
|


空间复杂度:

网络异常,图片无法展示
|
,按照题目中 就是存储排序后的数组所占用。


运行结果


网络异常,图片无法展示
|


总结


这个题目是个以前做过题目的一个变形,从三元变成了四元,但是处理的思路是一样。只是处理的步骤会多一下。


所以这种题目,只要理解一个,一类的问题都能迎刃而解。继续加油~

目录
相关文章
|
存储 Rust 自然语言处理
【一起学Rust | 进阶篇 | thesaurus-rs库】Rust 的离线同义词库——thesaurus-rs
【一起学Rust | 进阶篇 | thesaurus-rs库】Rust 的离线同义词库——thesaurus-rs
144 0
|
机器学习/深度学习 存储 算法
【强化学习】常用算法之一 “Q-learning”
Q-learning算法是一种基于强化学习的无模型学习方法,通过学习到目标系统的Q值函数来解决智能体在给定环境下的最优决策策略问题。Q-learning算法是基于后验策略方法,即学习出目标系统的价值函数Q之后,通过使用某种策略来最大化该价值函数,称之为后验策略。Q-learning算法是偏差-方差权衡的算法,在偏差较高的情况下可以在基于模型的强化学习中找到一个接近最优策略的解决方案。同时它也具有较高的收敛速度和广泛的适用性,因为其只需要存储一个值函数,不需要存储模型。
961 0
【强化学习】常用算法之一 “Q-learning”
|
存储 编译器 测试技术
C++:list增删查改模拟实现
C++:list增删查改模拟实现
144 0
|
前端开发 Shell 测试技术
1.Git使用技巧-常用命令1
1.Git使用技巧-常用命令1
105 0
|
监控
带你读《2022技术人的百宝黑皮书》——基于特征全埋点的精排ODL实践总结(4)
带你读《2022技术人的百宝黑皮书》——基于特征全埋点的精排ODL实践总结(4)
147 0
Knowledge of Network Building&Maintenance(网络组建与维护知识点)
CH1 计算机网络技术基础 一、Gap Filing1.编码是将模拟数据or数字数据变换成数字信号,以便于数据的传输和处理。信号必须进行编码,使得与传输介质相适应。(第一点存疑) 2.在数据传输系统中,主要采用以下3种数据编码技术:-数字数据的数字信号编码-模拟数据的数字信号编码-数字数据的模拟信号编码Knowledge Extension:数据传输方式有以下4类a.模拟数据的模拟信号编码 b.数字数据的数字信号编码c.数字数据的模拟信号编码 d.模拟数据的数字信号编码这4类中除了模拟数据的模拟信号编码之外,其他3类都属于数据编码技术。
2324 0
|
SQL
【SQL 学习】表连接--natural join 的一个bug
自然连接(NATURAL JOIN)是一种特殊的等价连接,它将表中具有相同名称的列自动进行记录匹配。自然连接不必指定任何同等连接条件。这篇文章讲的一个关于natural join 的bug!(由 dingjun123 提示!) SQL> conn store/yang已连接。
689 0
|
3天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
347 123
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?