博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[leetcode]4Sum
阅读量:5354 次
发布时间:2019-06-15

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

这道4Sum,如果用3Sum类似的方法,是O(n^3)的复杂度。现在使用O(n^2)的空间呢,能达到O(n^2)的时间复杂度。但实现起来坑还是不少,一是要去重,用了string来表示集合的key;二是不能同一个索引位置的数(num[i])出现两次,所以要做下标的检查;三是当左右相加等于target的时候,现在不能直接跳过大小一样的,因为同样大小的可能是a+b也可能是c+d,就要l++和r--递归来做。但用递归有可能爆栈(Runtime Error),就用了Stack来模拟递归。最终Java 1472ms过。

后来参考方勤的版本,如果用map来存sum=>pair,在只求解(而非全部解)的情况下,可以O(n^2)写得更简洁。

import java.util.*;public class Solution {    private ArrayList
> ans = new ArrayList
>(); private HashSet
ansSet = new HashSet
(); private HashSet
posSet = new HashSet
(); public ArrayList
> fourSum(int[] num, int target) { ans.clear(); ansSet.clear(); posSet.clear(); Arrays.sort(num); int len = num.length; ArrayList
pairs = new ArrayList
(); for (int i = 0; i < len; i++) { for (int j = i+1; j < len; j++) { pairs.add(new Pair(num[i], num[j], i, j)); } } Collections.sort(pairs); Stack
stack = new Stack
(); stack.push(0); stack.push(pairs.size()-1); while (!stack.empty()) { int r = stack.pop(); int l = stack.pop(); if (l >= r) continue; String posKey = "" + l + "_" + r; if (posSet.contains(posKey)) continue; else posSet.add(posKey); int sum = pairs.get(l).sum + pairs.get(r).sum; if (sum < target) { stack.push(l+1); stack.push(r); } else if (sum > target) { stack.push(l); stack.push(r-1); } else // == { if (pairs.get(l).aIdx != pairs.get(r).aIdx && pairs.get(l).aIdx != pairs.get(r).bIdx && pairs.get(l).bIdx != pairs.get(r).aIdx && pairs.get(l).bIdx != pairs.get(r).bIdx) { // add to result; ArrayList
arr = new ArrayList
(); arr.add(pairs.get(l).a); arr.add(pairs.get(l).b); arr.add(pairs.get(r).a); arr.add(pairs.get(r).b); Collections.sort(arr); String key = ""; for (int k = 0; k < 4; k++) { key = key + arr.get(k) + "_"; } if (!ansSet.contains(key)) { ansSet.add(key); ans.add(arr); } } stack.push(l); stack.push(r-1); stack.push(l+1); stack.push(r); } } return ans; }}class Pair implements Comparable
{ int a; int b; int sum; int aIdx; int bIdx; public Pair (int a, int b, int aIdx, int bIdx) { this.a = a; this.b = b; this.sum = a + b; this.aIdx = aIdx; this.bIdx = bIdx; } public int compareTo(Pair that) { return this.sum - that.sum; }}

  

 

转载于:https://www.cnblogs.com/lautsie/p/3350725.html

你可能感兴趣的文章
老王学java之一个让我困惑的问题
查看>>
MapReduce运行过程以及原理
查看>>
金融数字,三位逗号隔开
查看>>
11.14
查看>>
ubuntu14.04 upgrade出现【Ubuntu is running in low-graphics mode】问题的一个解决办法
查看>>
jenks搭建与使用
查看>>
C# WebAPI 跨域问题Cors
查看>>
PHP之文件锁
查看>>
MFC绘图
查看>>
使用代码管理工具(git)管理代码的常用指令合集
查看>>
网络编程 socket
查看>>
修改tomcat默认使用的jdk版本
查看>>
我们为什么要搞长沙.NET技术社区(三)
查看>>
杭电acm Cake
查看>>
js函数中this的指向
查看>>
c++ 引用方式传递数组
查看>>
HBase学习之路 (九)HBase phoenix的使用
查看>>
关于eclispe保存代码自动格式化的设置
查看>>
LeetCode() Remove Duplicates from Sorted Array II
查看>>
【svn】idea svn 文件上会出现一个破书
查看>>