4Sum 找4个数之和为target@LeetCode

1.给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的 任意个数之和 等于 target,并打印出所有结果的索引,索引不能重复。 /* 做的一家公司笔试题,两数之和解决,N数之和想了半天,最终参考了别人的思路,收货不错 参考地址:https://blog.youkuaiyun.com/dengz_j/article/details/114540948?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161832685216780264062836%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522 阅读详情

模板化了,要计算 k-sum 复杂度为O(N^(k-1))


package Level3;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 4Sum
 * Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:
Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
The solution set must not contain duplicate quadruplets.

 For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

    A solution set is:
    (-1,  0, 0, 1)
    (-2, -1, 1, 2)
    (-2,  0, 0, 2)
 */
public class S18 {

	public static void main(String[] args) {
		int[] num = {1, 0, -1, 0, -2, 2};
		System.out.println(fourSum(num, 0));
	}
	
	// O(n^3) 
	public static ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
		Set<ArrayList<Integer>> ret = new HashSet<ArrayList<Integer>>();
		Arrays.sort(num);

		for (int i = 0; i < num.length; i++) {
			for (int j = i+1; j < num.length; j++) {
				int m = j+1, n = num.length-1;
				while(m < n){
					if(i!=j && j!=m && m!=n){
						if(num[m] + num[n] == target-num[i]-num[j]){
							ArrayList<Integer> list = new ArrayList<Integer>();
							list.addAll(Arrays.asList(num[i], num[j], num[m], num[n]));
							ret.add(list);
							m++;
							n--;
						}else if(num[m] + num[n] < target-num[i]-num[j]){
							m++;
						}else{
							n--;
						}
					}
				}
			}
		}
		
		return new ArrayList<ArrayList<Integer>>(ret);
	}
	
	// O(n^3 * log(n)) 超时!
	public static ArrayList<ArrayList<Integer>> fourSum2(int[] num, int target) {
		Set<ArrayList<Integer>> ret = new HashSet<ArrayList<Integer>>();
		Arrays.sort(num);

		for (int i = 0; i < num.length; i++) {
			for (int j = num.length-1; j > i+1; j--) {
				for (int k = i+1; k < j; k++) {
					if(i!=j && j!=k){
						int remain = target - (num[i] + num[j] + num[k]);
						int index = Arrays.binarySearch(num, k + 1, j, remain);
						if (index >= 0) {
							ArrayList<Integer> list = new ArrayList<Integer>();
							list.add(num[i]);
							list.add(num[k]);
							list.add(num[index]);
							list.add(num[j]);
							ret.add(list);
						}
					}
				}
			}
		}

		return new ArrayList<ArrayList<Integer>>(ret);
    }

}


public class Solution {
    public List<List<Integer>> fourSum(int[] num, int target) {
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        int len = num.length;
        Arrays.sort(num);
        
        for(int i=0; i<len; i++) {
            if(i >= 1 && i < len && num[i] == num[i-1]) {
                continue;
            }
            for(int j=i+1; j<len; j++) {
                if(j >= i+2 && j < len && num[j] == num[j-1]) {
                    continue;
                }
                int left = j+1, right = len-1;
                while(left < right) {
                    int sum = num[i] + num[j] + num[left] + num[right];
                    if(sum == target) {
                        List<Integer> al = new ArrayList<Integer>();
                        al.add(num[i]);
                        al.add(num[j]);
                        al.add(num[left]);
                        al.add(num[right]);
                        ret.add(al);
                        do {
                            left++;
                        } while(left < right && num[left] == num[left-1]);
                        do {
                            right--;
                        } while(left < right && num[right] == num[right+1]);
                    } else if(sum < target) {
                        left++;
                    } else {
                        right--;
                    }
                }
            }
        }
        return ret;
    }
}




保姆级教程:用Ubuntu 22.04搭建RustDesk中继服务器(含Cloudflare避坑指南) 本教程详细指导如何在Ubuntu 22.04上搭建RustDesk中继服务器,解决跨国远程协作的延迟问题。涵盖环境配置、Rust编译优化、服务部署及Cloudflare代理设置等关键步骤,帮助用户实现高性能的私有中继服务。 阅读详情

相关推荐

概率论—期末复习速成笔记(自用)

概率论期末复习

a200327的博客 2万+

在数组中找出四个数字的和等于指定数字(4Sum)

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: The solution

K.Sun 3253

必看!wechat-article-exporter:轻松批量下载公众号文章

微信搜索“”关注公众号。在信息爆炸的时代,我们每天都会接触到大量优秀的微信公众号文章。有时候,我们想要将这些精彩的内容保存下来,以便日后回顾或者分享给更多的人。然而,微信公众号并没有提供直接的批量下载功能,这给我们带来了不少困扰。今天,我要给大家分享一款非常实用的软件——wechat-article-exporter,它能够帮助我们轻松地批量下载微信公众号文章,让你不再为文章的保存而烦恼。

王乐平 技术博客 4352

四数之和为target(2)

【题目描述】 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。 【示例】 输入: A = [ 1, 2] B = [-2,-1] C = [-1, 2] D = [ 0, 2] 输出: 2 解释

fujch3的博客 304

小程序强制更新避坑指南:手把手教你实现无缝升级

本文详细解析小程序强制更新的实现方法,重点介绍wx.getUpdateManager API的使用技巧,帮助开发者规避冷热启动机制下的版本管理陷阱。通过实战案例展示如何设计多级更新提示策略,确保用户无缝升级,提升小程序版本更新率。

star的博客 280

RTAB-map:实时高效的SLAM库

Real‐time appearance‐based mapping (RTAB‐Map)是一种基于外观的闭环检测方法,具有良好的内存管理,以满足处理大场景和在线长周期管理要求。RTAB‐Map集成了视觉和激光雷达SLAM方案,并支持目前绝大多数的传感器 是一个强大的、开源的Simultaneous Localization and Mapping(SLAM)库,专为机器人和无人驾驶领域设计。它提供了一套完整的解决方案,用于构建三维地图,并在未知环境中进行实时定位与导航。 github项目地址 RTAB-

weixin_45761399的博客 1万+

数组-leetcode#18-四个数求和等于target的所有组合

class Solution { public: vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; if(nums.size()<=1) return res; sort(nums.begin(),nums.end()); for(int i.

u011089927的专栏 475

魔兽世界怀旧服宏命令全解析:从自动换装到智能判定,老玩家才知道的黑科技

本文全面解析魔兽世界怀旧服宏命令的高级应用,从自动换装到智能判定,揭秘老玩家专属的黑科技技巧。深入探讨怀旧服特有的宏命令机制,包括施法队列、装备切换系统和职业专属技巧,帮助玩家在经典旧世版本中提升战斗效率。

weixin_29230865的博客 730

四数之和为target

【题目描述】 给定一个包含 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]

fujch3的博客 306

RuyiDify如何创建知识库API密钥:让程序安全访问知识库

知识库 API Key 是程序访问知识库的钥匙。创建它很简单,但真正重要的是知道它能做什么、应该放在哪里、不能暴露给谁。RuyiDify 讲这一步,不是为了让大家多记一个按钮,而是为了把知识库从“人工上传资料”推进到“程序化维护资料”。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 136

【数字孪生与仿真技术】10:半导体制造中的虚拟量测技术深度解析:从多尺度建模到工业级应用

摘要:半导体制造过程中,晶圆加工需实时监测300+关键参数,传统物理量测技术面临产能损耗、延迟检测等痛点。本文系统阐述虚拟量测(Virtual Metrology)技术的完整解决方案,通过多尺度混合建模实现物理机理与数据驱动的深度融合。内容涵盖等离子体刻蚀、薄膜沉积等关键工艺的物理模型构建,LSTM神经网络的数据校正算法,以及边缘-云协同的实时部署架构。某12英寸晶圆厂实践表明,虚拟量测技术可减少70%物理量测频次,异常漏检率从18%降至3%,机台利用率提升11%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2548

Combination Sum 无序数组中找组合(每个元素可用多次)使得和为target@LeetCode

典型DFS package Level3; import java.util.ArrayList; import java.util.Arrays; /** * * Combination Sum * * Given a set of candidate numbers (C) and a target number (T), find all unique * co

2029

使用 Simulink 搭建一个地震信号反射系数反演与滤波联合仿真的系统模型

《Simulink地震信号处理仿真指南》摘要:本文详细介绍了使用Simulink进行地震信号反射系数反演与滤波联合仿真的完整流程。从创建模型、生成含噪合成地震记录(包含子波卷积与随机反射系数),到设计滤波模块(带通/小波/自适应滤波)和实现反演算法(Wiener-Hopf方程/RLS方法),最后通过可视化模块分析结果。教程涵盖理论准备、7个实施步骤、优化建议及实际应用场景,为地震勘探、地质调查等领域提供标准化的信号处理仿真方案,特别适合需要掌握地震信号反演与实时滤波技术的工程人员学习。

amy_mhd的博客 113

三数之和: 给一个整型数组nums, 一个目标值target, 从数组中找出所有三个数之和等于target的整数, 并返回这三个整数的下标。

一)介绍 题意:从指定的整型nums数组中,随机取三个数,这三个数之和需要等于指定的target,如下图。 分析:第一种场景是nums数组中没有负数的情况,这种情况求和的计算会少一点,因为只要比target大的数都不需要计算。 第二种场景是nums数组中有负数的情况,这种情况求和,就需要考虑nums中所有的数了,本章是考虑了该情况。 问题解决思路:先从nums数组中...

p812438109的专栏 3378

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

(java)找出数组中和为K的一组解(动态规划)

考虑N个数的数组A中是否存在和为K的解,可以分为考虑(N-1个数中是否有和为K的解)或者(N-1个数中是否有和为K-A[N-1]的解(解包含A[N-1]的情况))。也就是说,动态规划方程是:P[N][K]=P[N-1][K]||P[N-1][K-A[N-1]];直接上代码:        //找出数组中和为K的一组解 public void Solve(int[] a,int k){ if ...

zhang___yong的博客 3487

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

四数之和为target特定值的序列

(1)算法思路是简单的。先求出所有的

术学家笔记 521

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【leetcode】【题目小结】n数之和

1. 2数之和 无序数组,找和为target的2个数字,返回下标。 解法:hash表记录之前遇到的数字,表中不存在互补的则继续向后找。 2. 2数之和-有序数组 有序数组,找和为target的2个数字。 解法:头尾双指针 3. 在BST上的2数之和 数据用BST形式储存。 解法1:BST中序遍历输出为有序数组,做法转为2。 解法2:hash表记录已遍历内容,做法类似1。 解法3:BST上的递归,看作从中间向两端的双指针。 4. 2数之和小于target 找出和小于t...

lemonade13的博客 657

LeetCode-Target Sum

LeetCode Java Target Sum

坟头草一米七五 279

LeetCode 18 4Sum(4个数的和)

翻译 给定一个有n个数字的数组S,在S中是否存在元素a,b,c和d的和恰好满足a + b + c + d = target。 找出数组中所有的不想等的这四个元素,其和等于target。 备注: 在(a,b,c,d)中的元素必须从小到大排列。(a ≤ b ≤ c ≤ d) 其结果必须不能够重复。 例如,给定S = {1 0 ...

weixin_33907511的博客 185

LeetCode 1. 两数之和(target,暴力/哈希表)

思路: 1. 直接暴力两重循环,O()枚举查询即可。 2. 利用哈希表,O(1)直接查询 target-num[i]即可,整体时间复杂度O(n)。

Satur9的博客 201

【练习题】25.找出N个数之和等于M

/* 题目: 给定一个target,和一个"有序"数组ra。 要求: 从ra中挑选length2个数,使得它们之和等于target; 说明: length2个数中可以出现重复 例子: 如 a+b+c = 31,a/b/c都来自于[1,3,5,7,9,11,13,15]。 则 *

hsjshichengxuyuan的博客 1771

Git stash 实战指南:时间暂停键与轻量级快照原理

Git stash 是 Git 中用于临时保存未提交更改的核心机制,其本质并非文件备份,而是基于 commit、tree 和 index 三对象构成的原子化快照,实现工作区状态的精准封存与还原。它遵循最小惊异原则,默认仅操作已跟踪文件,保障环境安全;通过 LIFO 栈管理与语义化消息(-m)支持可追溯性;结合 -u(含未跟踪文件)、-p(交互式补丁)等参数,适配调试、紧急回滚、跨分支协作等高频工程场景。本文深入解析 stash 的底层设计、典型误用、冲突处理及团队规范,助力开发者从‘能用’迈向‘稳用’。

weixin_30673611的博客 438

Valid Number 判断一个string是不是有效地数字表达式 @LeetCode

这道题看了看网上的解法,很多都做得很麻烦。其实我觉得,这道题就是考察正则表达式。 package Level2; /** * Valid Number * * Validate if a given string is numeric. Some examples: "0" => true " 0.1 " => true "abc" => false "1 a" =>

1万+

Maximum Subarray 最大子数组和(连续)@LeetCode

package Level3; import java.util.Arrays; /** * * Maximum Subarray * * Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, give

6667

Binary Tree Level Order Traversal II 二叉树按层遍历(反向输出)@LeetCode

树的Level Order Traversal加上ArrayList翻转 package Level3; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import Utility.TreeNode; /** * Binary Tree Level Order T

5192

Binary Tree Level Order Traversal 分层遍历二叉树@LeetCode

package Level3; /** * Binary Tree Level Order Traversal * * Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example: G

5154
上一篇: Letter Combinations of a Phone Number 电话按键字符的组合@LeetCode
下一篇: Generate Parentheses 产生所有括号组合 @LeetCode
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值