LeetCode:四数之和【18】

题目描述

给定一个包含 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]
]

题目分析

  四数之和和三数之和求解思路一毛一样。三数之和解析:https://www.cnblogs.com/MrSaver/p/5913336.html

  首先数组进行有序话,接着我们固定a和b,在ab固定的情况下,cd分别向内考虑,调整四数之和

  当c和d把所有情况都遍历完后,b向右移动一格并固定,cd分别向内考虑,调整四数之和

  当b移动到倒数第三位时,b的所有情况就算遍历玩了,最后a向右移动一格并固定

  

  我们知道用双指针模型解决问题,就要将N数之和的前N-2项进行固定,通过移动N项和N-1项来匹配目标值,即五数之和就需要将a,b,c固定,移动d、e

  所谓固定不是不移动,他们仍然需要进行暴力的遍历操作,只是在双指针移动完后再动。

  这道题还是很值得思考的!

Java题解

public class Solution {
public static List<List<Integer>> fourSum(int[] nums, int target) {
//[!]这里引入map用来去重
Map<String,Boolean> map = new HashMap<>();
List<List<Integer>> result = new ArrayList<>(); //[!]数组长度小于4直接返回空
if(nums.length < 4) return result; //[!]做排序以便使用双指针模型
Arrays.sort(nums); int a = 0;
while(a < nums.length - 3) {
int b = a + 1;
while (b<nums.length-2){
int c = b + 1;
int d = nums.length-1;
while(c < d) {
int sum = nums[a] + nums[b] + nums[c]+nums[d];
if(sum == target) {
if(!map.containsKey(nums[a]+"|"+nums[b]+"|"+nums[c]+"|"+nums[d]))
{
map.put(nums[a]+"|"+nums[b]+"|"+nums[c]+"|"+nums[d],true);
result.add(Arrays.asList(nums[a], nums[b], nums[c],nums[d]));
}
}
//[!]一直递增C,直到和等于或大于目标值
if(sum <= target) while(nums[c] == nums[++c] && c < d);
//[!]当值大于目标值时,开始递减D,等于时判断使d跳过重复值
if(sum >= target) while(nums[d--] == nums[d] && c < d);
}
b++;
}
a++;
}
return result;
} public static void main(String[] args) {
int[] nums = {1,0,-1,0,-2,2};
fourSum(nums,0); }
}

  

  

LeetCode:四数之和【18】的更多相关文章

  1. leetcode 四数之和

    这里我们可以考虑将 n 数之和降低为一个数加上 n-1 数之和的问题.依次降低 ,最低是二数之和的问题 ,二数之和问题容易解决.主要在于从 n 到 n-1 的过程需要理解 :下列代码中前几个 if 是 ...

  2. Java实现 LeetCode 18 四数之和

    18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target ...

  3. 【LeetCode】18.四数之和

    题目描述 18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 t ...

  4. 【LeetCode】18. 4Sum 四数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:four sum, 4sum, 四数之和,题解,leet ...

  5. Leetcode(18)-四数之和

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满 ...

  6. [LeetCode] 454. 4Sum II 四数之和II

    Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...

  7. 【LeetCode】 454、四数之和 II

    题目等级:4Sum II(Medium) 题目描述: Given four lists A, B, C, D of integer values, compute how many tuples (i ...

  8. LeetCode:两数之和、三数之和、四数之和

    LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...

  9. 代码随想录第七天| 454.四数相加II、383. 赎金信 、15. 三数之和 、18. 四数之和

    第一题454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, ...

随机推荐

  1. P5024 保卫王国[倍增+dp]

    窝当然不会ddp啦,要写这题当然是考虑优化裸dp啦,但是这题非常麻烦,于是变成了黑题. 首先,这个是没有上司的舞会模型,求图的带权最大独立集. 不考虑国王的限制条件,有 \[ dp[x][0]+=dp ...

  2. Django REST framework —— 认证组件源码分析

    我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...

  3. linux ssh tunnel

    ssh -qTfnN -D 7070 ape@192.168.1.35

  4. 如何使用keil5将stm32的hal库编译成lib文件——F1版本

    hal库中keil5中编译的速度是比较慢的,相同情况下,每次都要编译的时候,比标准库是要慢很多的,因此就hal库编译成lib文件是一种加快编译速度的方法,当然也有其自身的缺点.一.步骤1.使用cube ...

  5. 使用SpringBoot访问jsp页面

    1 编写application.yml文件 spring: mvc: view: suffix: .jsp prefix: /jsp/ 2 创建Controller层 @Controller @Req ...

  6. c++合并两个序列函数merge()和inplace_merge()

    大家在写归并排序时是不是觉得合并两个序列有点麻烦,有快速的方法吗? 我们全部函数自己写,比如: #include<bits/stdc++.h> using namespace std; # ...

  7. VS2010中使用boost正则表达式库

    1.下载boost库.http://www.boost.org/ 我下载的是boost_1_51_0版本.放在D:\opensource\boost_1_51_0. 2.编译boost库.     执 ...

  8. Theano入门笔记1:Theano中的Graph Structure

    译自:http://deeplearning.net/software/theano/extending/graphstructures.html#graphstructures 理解Theano计算 ...

  9. epoch,iteration与batchsize的区别

    神经网络中epoch与iteration是不相等的 batchsize:中文翻译为批大小(批尺寸).在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练: iterat ...

  10. JavaScript的入门篇

    快速认识JavaScript 熟悉JavaScript基本语法 窗口交互方法 通过DOM进行网页元素的操作 学会如何编写JS代码 运用JavaScript去操作HTML元素和CSS样式 <!DO ...