18
来源:互联网 发布:java个人信息管理系统 编辑:程序博客网 时间:2024/04/29 11:56
package scalaCode/** * Created by zp on 2017/7/13. */package leetcodeimport scala.collection.mutable.ListBufferimport scala.util.control.Breaksobject FourSum { def twoSumForFourSum(nums: Array[Int], target: Int, start: Int, res: ListBuffer[ListBuffer[Int]], z1: Int, z2: Int): Unit = { val high = nums.size - 1 if (start >= high) { return None } if (2 * nums(start) > target || 2 * nums(high) < target){ return None } var i = start var j = high var sum = 0 var x = 0 while (i < j){ sum = nums(i) + nums(j) if (sum == target){ val tmp = new ListBuffer[Int] tmp += (z1, z2, nums(i), nums(j)) res += tmp x = nums(i) while (i < j && nums(i) == x) {i += 1} x = nums(j) while (i < j && nums(j) == x) {j -= 1} } if (sum < target){ i += 1 } if (sum > target) { j -= 1 } } } def threeSumFourSum(nums: Array[Int], target: Int, start : Int, res: ListBuffer[ListBuffer[Int]], z1: Int) { val high = nums.size - 1 val max = nums(high) //异常情况 if (3 * nums(start) > target || 3 * max < target){ return } var first = new Breaks var second = new Breaks var thrid = new Breaks var loop = new Breaks var z = 0 loop.breakable{ for (i <- start to high){ z = nums(i) first.breakable{ if (i > start && z == nums(i - 1)){ first.break() } } second.breakable{ if (z + 2 * max < target) { second.break() } } thrid.breakable{ if (3 * z > target){ thrid.break() } } if ( 3 * z == target) { if (i + 2 <= high && nums(i + 2) == z){ val tmp = new ListBuffer[Int] tmp += (z1, z, z, z) res += tmp } else { loop.break() } } twoSumForFourSum(nums, target - z, i + 1, res, z1, z ) } } } def fourSum(ns: Array[Int], target: Int): List[List[Int]] = { val res = new ListBuffer[ListBuffer[Int]] //异常情况 if (ns == None || ns.size < 4) { return (for (l <- res) yield l.toList).toList } //默认排序 var nums = for(n <- ns.sorted) yield n //临界情况 val max = nums(nums.size - 1) val min = nums(0) if (4 * min > target || 4 * max < target) { return (for (l <- res) yield l.toList).toList } var first = new Breaks var second = new Breaks var thrid = new Breaks var loop = new Breaks var z = 0 loop.breakable{ for (i <- 0 to nums.size - 1) { z = nums(i) first.breakable { //避免重复,continue if (i > 0 && z == nums(i - 1)) { first.break() } //z太小 if (z + 3 * max < target) { first.break() } //z太大 if (4 * z > target) { first.break() } } //边界情况 if (4 * z == target) { if (i + 3 < nums.size && nums(i + 3) == z) { val tmp = new ListBuffer[Int] tmp += (z, z, z, z) res += tmp } else { loop.break() } } threeSumFourSum(nums, target - z, i + 1, res, z) } } (for (l <- res) yield l.toList).toList } def main(args: Array[String]): Unit = { var a = Array(1, 0, -1, 0, -2, 2) println(fourSum(a, 0)) }}
阅读全文
0 0
- 18
- 18
- 18
- 18
- 18
- 18
- 18
- 18
- 18
- 18
- 18
- #18
- 18
- 18
- 18:18 day
- 18顆櫻桃,18次彎腰
- Codeforces 18A 18B 18C
- 18 Log4J
- POJ 2135 Farm Tour(最小费用最大流模板题)
- Golang教程:(十八)接口
- 【Git】学习笔记之基本操作
- ValueAnimator属性动画
- 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言?
- 18
- 1
- 快速排序
- 秒懂!何凯明的深度残差网络PPT是这样的|ICML2016 tutorial
- 【软件安全】cwe-89 SQL Injection(二)
- jquery 插件开发/插件编写$.fn.extend(),$.extend()
- @Embedded和@Embeddable
- TCP报文段首部分析详解
- Codeforces 828 C String Reconstruction