博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】4Sum(middle)
阅读量:7120 次
发布时间:2019-06-28

本文共 2512 字,大约阅读时间需要 8 分钟。

Given an array S of n integers, are there elements abc, 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)

 

思路:

讨论里有说O(N2)的解法,好像是分为两个2 Sum来做。没仔细看。

下面贴个常规O(n3)解法,注意去重。 

vector
> fourSum(vector
&num, int target) { vector
> ans; if(num.size() < 4) return ans; int l1, l2, l3, l4; sort(num.begin(), num.end()); for(l1 = 0; l1 < num.size() - 3; l1++) { if(l1 > 0 && num[l1] == num[l1 - 1]) continue; //注意去重复方法 含义是在另外三个数字固定的情况下 同一位置的数字不能重复 for(l4 = num.size() - 1; l4 >= l1 + 3; l4--) { if(l4 < num.size() - 1 && num[l4] == num[l4 + 1]) continue; l2 = l1 + 1; l3 = l4 - 1; while(l2 < l3) { if(num[l1]+num[l2]+num[l3]+num[l4] == target) { vector
partans; partans.push_back(num[l1]); partans.push_back(num[l2]); partans.push_back(num[l3]); partans.push_back(num[l4]); ans.push_back(partans); l2++; while(num[l2] == num[l2 - 1]) { l2++; } l3--; while(num[l3] == num[l3 + 1]) { l3--; } } else if(num[l1]+num[l2]+num[l3]+num[l4] < target) { l2++; } else { l3--; } } } } return ans; }

 

大神看起来更统一的代码:

public class Solution {    public List
> fourSum(int[] num, int target) { List
> results = new LinkedList
>(); if (num == null || num.length < 4) return results; Arrays.sort(num); for (int s = 0; s < num.length - 3; s++) { if (s > 0 && num[s] == num[s - 1]) continue; for (int e = num.length - 1; e >= s + 3; e--) { if (e < num.length - 1 && num[e] == num[e + 1]) continue; int local = target - num[s] - num[e]; int j = s + 1; int k = e - 1; while (j < k) { if (j > s + 1 && num[j] == num[j - 1]) { j++; continue; } if (k < e - 1 && num[k] == num[k + 1]) { k--; continue; } if ((num[j] + num[k]) > local) k--; else if ((num[j] + num[k]) < local) j++; else results.add(new ArrayList
(Arrays.asList( num[s], num[j++], num[k--], num[e]))); } } } return results; }}

 

转载地址:http://osiel.baihongyu.com/

你可能感兴趣的文章
iOS--React Native浏览器插件
查看>>
一个JSON字符串和文件处理的命令行神器jq,windows和linux都可用
查看>>
Flask源码解析:从第一个版本开始阅读Flask源码
查看>>
JavaScript 工作原理之二-如何在 V8 引擎中书写最优代码的 5 条小技巧(译)
查看>>
SpringBoot Cache 深入
查看>>
Three.js Scene Graph
查看>>
PAT A1045 动态规划
查看>>
保持ssh的连接不断开
查看>>
897-递增顺序查找树
查看>>
wiki迁移方法操作步骤
查看>>
php_screw
查看>>
Go语言之读写锁
查看>>
openstack mitaka 完整安装详细文档(亲测,花了3天时间)
查看>>
for 循环嵌套for循环
查看>>
GTID复制异常的解决步骤
查看>>
【沫沫金】安卓手机版 - 日期控件
查看>>
在Linux使用exec执行命令时报的哪些错
查看>>
Waud.js – 使用HTML5降级处理的Web音频库
查看>>
WIN10 64位 JDK的安装
查看>>
CentOS 6.2目录服务之LDAP(一)
查看>>