经典算法面试题系列 (二)——three sum
来源:互联网 发布:螺旋楼梯计算软件 编辑:程序博客网 时间:2024/06/08 17:31
接着two sum,three sum的难度上升了不少。因为two sum的答案是唯一的,three sum的答案是多个。题目链接https://leetcode.com/problems/3sum/#/description。
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],A solution set is:[ [-1, 0, 1], [-1, -1, 2]]其实还是像two sum,先假设已经找到第一个数,剩下的就是循环判断第二个数加上第三个数等于第一个数。当然还有一个问题,就是需要处理重复。处理重复思路是这样的,先找到所有的组合,再做处理。
1.golang 版
package mainimport ("fmt""sort")func main() {var nums = []int{-1, 0, 1, 2, -1, -4}three := threeSum(nums)fmt.Println(three)}func threeSum(nums []int) [][]int {if len(nums) <= 0 {return [][]int{}}if !sort.IntsAreSorted(nums) {sort.Ints(nums)}var sum intvar res [][]intfor i := 0; i < len(nums); i++ {target := -nums[i]front := i + 1back := len(nums) - 1for front < back {sum = nums[front] + nums[back]if sum < target {front++} else if sum > target {back--} else {var tripliet = []int{nums[i], nums[front], nums[back]}res = append(res, tripliet)for front < back && nums[front] == tripliet[1] {front++}for front < back && nums[back] == tripliet[2] {back--}}}for i+1 < len(nums) && nums[i+1] == nums[i] {i++}}return res}
2.php 版
function threeSum($nums) { if (count($nums) <= 0) { return [[]]; } sort($nums); $res = []; for($i = 0; $i < count($nums); $i++) { $target = -$nums[$i]; $front = $i + 1; $back = count($nums) - 1; while($front < $back) { $sum = $nums[$front] + $nums[$back]; if ($sum < $target) { $front ++; } else if ($sum > $target) { $back --; } else { $triplet = [$nums[$i], $nums[$front], $nums[$back]]; $res[] = $triplet; while($front < $back && $nums[$front] == $triplet[1]) { $front ++; } while($front < $back && $nums[$back] == $triplet[2]) { $back --; } } } while($i + 1 < count($nums) && $nums[$i + 1] == $nums[$i]) { $i ++; } } return $res; } $nums = [-1, 0, 1, 2, -1, -4]; $three = threeSum($nums); var_dump($three);
阅读全文
0 0
- 经典算法面试题系列 (二)——three sum
- 经典算法面试题系列(一)——tow sum
- 经典算法面试题(二)
- 经典算法面试题系列(三)——不使用系统函数排序数组
- @经典面试题(二)@
- 经典面试题(二)
- 经典面试题之 —— 洗牌算法(打乱)
- 算法经典面试题
- 经典算法面试题
- 经典算法面试题(-)
- 经典算法面试题
- 算法面试题(二)
- Java面试题系列--经典算法题(持续更新)
- 经典的SQL面试题(二)
- 经典C/C++面试题(二)
- 经典C/C++面试题(二)
- 经典Hibernate面试题(二)
- java经典面试题(二)
- 统计大写字母个数
- mysql5.7无法启动问题
- 前台是https 443后台就不需要了
- 生产者消费者模式in C
- oracle 取当前日期时间的前一天前一小时前一分钟前一秒
- 经典算法面试题系列 (二)——three sum
- 使用git将本地项目放入git服务器远程仓库
- spring-data-redis接口调用出现乱码的问题
- springcloud使用consul作为配置中心
- 栈和队列
- JAVA多线程实现的两种方式
- 《从零开始搭建游戏服务器》 java与C#的protobuf序列化不兼容
- 别人总结一些ios技术博客,仅供大家参考
- 分享一些个人觉得有创意的网站元素