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. Linux常用命令学习一

    rpm -qa |grep jdk:查询系统中是否有存在jdk的rpm已安装程序: rpm -e --nodeps jdk1.8:卸载jdk1.8的程序: rpm -ivh rpm文件:安装rpm文件 ...

  2. JQuery系列(2) - 事件处理

    JQuery事件绑定 (1)on方法 on方法是jQuery事件绑定的统一接口.后面介绍的事件绑定的那些简便方法,其实都是on方法的简写形式. $('li').on('click', function ...

  3. C++中的hash_map和map的区别

    hash_map和map的区别在哪里?构造函数.hash_map需要hash函数,等于函数:map只需要比较函数(小于函数). 存储结构.hash_map采用hash表存储,map一般采用红黑树(RB ...

  4. getProperty获取属性值

  5. 题解 UVa11076

    题目大意 多组数据,每组数据给出 \(n\) 个一位数,求出这些一位数组成的所有不同整数的和. 分析 考虑一个数对某一位的贡献,为这个数乘以其他数的全排列数,问题转化为可重复元素的全排列. 引理 \( ...

  6. springboot使用jpa案例

    1 创建entity实体类并生成数据库表 @Entity @Table(name="student") public class Student { @Id @GeneratedV ...

  7. gin+redis

    var RedisDefaultPool *redis.Pool func newPool(addr string) *redis.Pool { return &redis.Pool{ Max ...

  8. PostgreSQL JSON 处理

    1.JSON类型    PostgreSQL支持JSON和JSONB.这两种类型在使用上几乎完全一致,主要区别是: (1)JSON类型把输入的数据原封不动的存放到数据库中.JSONB类型在存放时把JS ...

  9. 思科ASA对象组NAT

    ACL对象组NAT配置 ciscoasa#conf t ciscoasa(config)#hostname ASA ASA(config)#domain-name asa.com ASA(config ...

  10. Codeforces & Atcoder神仙题做题记录

    鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...