4 sum

news/2024/7/5 21:14:04

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

FROM: https://leetcode.com/problems/4sum/

 

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: 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]
]

最简单直观的办法就是四层循环,依次相加,找出符合条件的四元数组即可,时间复杂度为N*N * N * N;

当然有更快的算法;

先考虑找出相加等于给定数字的二元数组的办法:

1. 将数组排序;

2. 两个指针, i & j, 分别从头和尾开始移动, 只考虑最简单的情况:

    a) nums(i) + nums(j) > target; 因为已经排序, 所以有nums(i) + nums(j - 1) < nums(i) + nums(j), 所以将指针j向前移动1为, 有可能得到和target相等的数字;

    b) nums(i) + nums(j) < target; 相应的将i向后移动1位;

    c) nums(i) + nums(j) == target; 这时已经找到一组复合条件的数字,分别将i 和j移动一位;

通过以上的步骤可以O(N)的时间内解决2 sum的问题;

然后考虑找出相加等于给定数字的三元组的问题:

1. 排序;

2. 从前(或者从后)开始,依次处理每个数字;

3. 从给定数字后面(或者前面)的子数组中, 寻找相加等于target - nums(i)的二元组;

4. 将第三步得到的二元组加上nums(i)扩充为3元组;

 

那么四元组和三元组的解法是一致的, 先找到三元组, 然后扩充为四元组;

 

package main

import (
	"fmt"
	"sort"
)

func main() {
	nums := []int{1, 0, -1, 0, -2, 2}
	result := fourSum(nums, 0)
	for _, x := range result {
		fmt.Printf("%v\n", x)
	}
}

func fourSum(nums []int, target int) [][]int {
	sort.Ints(nums)
	result := make([][]int, 0, 10)

	for i := len(nums) - 1; i > 2; i-- {
		if i < len(nums)-1 && nums[i] == nums[i+1] {
			continue
		}
		xs := threeSum(nums[:i], target-nums[i])
		for _, x := range xs {
			result = append(result, append(x, nums[i]))
		}
	}

	return result
}

func threeSum(nums []int, target int) [][]int {
	result := make([][]int, 0, 10)
	for i := len(nums) - 1; i > 1; i-- {
		if i < len(nums)-1 && nums[i] == nums[i+1] {
			continue
		}
		xs := twoSum(nums[:i], target-nums[i])
		for _, x := range xs {
			result = append(result, append(x, nums[i]))
		}
	}

	return result
}

func twoSum(nums []int, target int) [][]int {
	result := make([][]int, 0, 10)
	for i, j := 0, len(nums)-1; i < j; {
		if i > 0 && nums[i] == nums[i-1] {
			i++
			continue
		}

		if j < len(nums)-1 && nums[j] == nums[j+1] {
			j--
			continue
		}

		sum := nums[i] + nums[j]
		if sum < target {
			i++
		} else if sum > target {
			j--
		} else {
			result = append(result, []int{nums[i], nums[j]})
			i++
			j--
		}
	}
	return result
}

 

转载于:https://my.oschina.net/u/922297/blog/703627


http://www.niftyadmin.cn/n/1904171.html

相关文章

2017-2018-1 20155225 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155225 《信息安全系统设计基础》第九周学习总结 教材学习内容总结 6.1存储技术 随机访问存储器&#xff08;RAM&#xff09;静态RAM(SRAM):SRAM比DRAM快&#xff0c;作为高速缓存存储器。具有双稳定状态&#xff0c;只要有电&#xff0c;它就会永远地保存它的值…

为什么《自己动手设计物联网》 和《全栈应用开发》一样也打了 4.9 折??

今天&#xff0c;又打开了一次亚马逊&#xff0c;想看看评论里有没有什么好的反馈。然后&#xff1a;这不是和之前的《全栈应用开发》一样吗&#xff1f;为什么《自己动手设计物联网》 和《全栈应用开发》一样也打了 4.9 折&#xff1f;&#xff1f;为什么《自己动手设计物联网…

http://blog.sina.com.cn/s/blog_546abd9f0101c6au.html

http://blog.sina.com.cn/s/blog_546abd9f0101c6au.html

asp.net MVC2 初探十

还是讲一些项目中你可能遇到的问题&#xff0c;有的时候人总是不听话&#xff0c;想改变原有的东西。今天我就教你怎么样颠覆MVC传统的文件夹结构&#xff0c;即个性化你的目录。ok&#xff0c;开始。先看看我设计的目录我的controller下有这么多文件夹。再看看我的views看到了…

Serverless 架构应用开发指南:创建自己的 Serverless 短链服务

在想用 Serverless 可以做点什么简单的在线应用后&#xff0c;我想到了一个是在线短链生成服务。最后的结果见&#xff1a;http://x.pho.im/&#xff0c;一个非常简单的在线应用。 这里的代码基于&#xff1a;https://github.com/vannio/serverless-shrink。 因为上面的代码中…

Oracle数据库备份与恢复 - 增量备份

RMAN一个强大的功能是支持增量备份&#xff0c;增量备份中心思想就是减少备份的数据量&#xff0c;我们不需要在从头开始备份了&#xff0c;只需要备份自上次已备份之后的数据块即可。 关于Incremental增量备份级别&#xff1a; Oracle 9i 共有五种级别 0 1 2 3 4&#xff0c;0…

这『六本』电子书助你成为顶尖程序员(含下载地址)

epub、pdf、mobi、rtf&#xff0c;你还需要什么格式呢&#xff1f;作为一个自谥是 markdown 程序员的 “资深咨询师”&#xff0c;我编写了很多的代码&#xff0c;写了很多文章&#xff08;我的博客 phodal.com 上有 600&#xff09;&#xff0c;也写了很多电子书。文章&#x…

花了 1000G,我终于弄清楚了 Serverless 是什么(上)?

在过去的 24 小时&#xff0c;我通过微信公号的『电子书』一事&#xff0c;大概处理了 8000 个请求&#xff1a;Serverless 请求统计大部分的请求都是在 200ms 内完成的&#xff0c;而在最开始的请求潮里&#xff08;刚发推送的时候&#xff0c;十分钟里近 1500 个请求&#xf…