四数之和

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

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

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/4sum/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:双指针法

首先,将nums排序;然后firstfourth指针分别从数组的第一个和最后一位开始,secondthird指针分别从first+1fourth-1处从两边向内移动,直到second不小于third,移动过程中需要判断4个指针所指向的数字之和是否和target相等,如果相等,则放到结果集result里面。 直到遍历到first不小于fourth-2为止,最后返回结果result

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; public class Solution { public static List<List<Integer>> fourSum(int[] nums, int target) {
if (nums == null || nums.length < 4) {
return new ArrayList<>();
}
if (nums.length == 4 && nums[0] + nums[1] + nums[2] + nums[3] != target) {
return new ArrayList<>();
}
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<>();
for (int first = 0, fourth = nums.length - 1; first < fourth - 2; first++) {
// 过滤掉重复的
if (first > 0 && nums[first] == nums[first - 1]) {
continue;
} while (first < fourth - 2) {
// 过滤掉重复的
if (fourth < nums.length - 1 && nums[fourth] == nums[fourth + 1]) {
fourth--;
continue;
}
for (int second = first + 1, third = fourth - 1; second < third; second++) {
// 过滤掉重复的
if (second > first + 1 && nums[second] == nums[second - 1]) {
continue;
}
while (second < third && nums[first] + nums[second] + nums[third] + nums[fourth] > target) {
third--;
}
if (second != third && nums[first] + nums[second] + nums[third] + nums[fourth] == target) {
result.add(new ArrayList<>(Arrays.asList(new Integer[]{nums[first], nums[second], nums[third], nums[fourth]})));
}
}
fourth--;
}
fourth = nums.length - 1;
} return result;
} public static void main(String[] args) {
int[] nums = new int[]{-3, -1, 0, 2, 4, 5};
for (List<Integer> integers : fourSum(nums, 0)) {
for (Integer integer : integers) {
System.out.print(integer + "/");
}
System.out.println();
}
}
}

【每日寄语】忠实的守住自己最初的梦想,让生活的每一天都变得有意义。

最新文章

  1. select2 demo
  2. _NSInlineData objectForKeyedSubscript:
  3. vmware 下centos7配置网络
  4. 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】
  5. Matlab 读取文件夹中所有的bmp文件
  6. opengl中对glOrtho()函数的理解
  7. 【原创】安装LoadRunner12.53 版本时出现Critical error的解决方法
  8. oracle 高版本导出低版本数据库并且导入到低版本数据的方法
  9. Word中表格内容被遮挡
  10. .NET 相依性注入
  11. 1002: [FJOI2007]轮状病毒
  12. FORM调用FORM(标准调客户化&amp;客户化调标准)并执行查询的实现研究
  13. Nginx多虚拟主机下泛域名配置
  14. DevOps概述
  15. PHP无限分类分类导航LINK的代码实现
  16. Gradle 大杂烩
  17. windows 开启热点的命令行工具
  18. modal template
  19. vmware安装找不到虚拟网卡解决方案
  20. highstock禁用UTC

热门文章

  1. JavaScripts调用摄像头【MediaDevices.getUserMedia()】
  2. Vue之watch监听对象中某个属性的方法
  3. 关于老Windows平板电脑睡眠状态下无法开机(睡死)的问题及解决方案
  4. 论新手该如何学习java?
  5. SnapKit
  6. JAVA多线程学习七-线程池
  7. mysql获取表中的字段名
  8. 转载_认识C语言的32个关键字
  9. mysql 查询附近N公里内数据
  10. Dubbo源码剖析六之SPI扩展点的实现之getExtensionLoader