【LeetCode每天一题】4Sum(4数之和)
Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums 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.
Example:
Given array nums = [, , -, , -, ], and target = . A solution set is:
[
[-, , , ],
[-, -, , ],
[-, , , ]
]
思路
在看到这道题之后,我第一反应是使用之前求三数之和那样求四数之和,结果也是可行,但是运行结果显示的时间复杂度太高。这里我先将我自己的解决思路写下来
时间复杂为O(n3),空间复杂为O(1)。
解决代码
class Solution:
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
if len(nums) < : # 异常情况,小于四个直接返回
return []
if len(nums) == and sum(nums) == target:
return [nums]
nums.sort() # 先进行排序
res = []
for i in range(len(nums)-): # 第一个下标
if i > and nums[i] == nums[i-]: # 遇到重复的直接跳过
continue
for j in range(i+, len(nums)-): # 第二个下标
if j > i+ and nums[j] == nums[j-]: # 遇到重复直接跳过
continue
start, end = j+, len(nums)-1 # 另外两个下标,指向头和尾部
while start < end:
tem = nums[i] + nums[j] + nums[start] + nums[end]
if tem - target > : # 进行判断,选择相应的移位
end -=
elif tem - target < :
start +=
else: # 找到符合条件的四个数字。
res.append([nums[i], nums[j], nums[start], nums[end]]) # 将其添加进结果集中
while start < end and nums[start] == nums[start+]: # 相同元素直接跳过。
start +=
while start < end and nums[end] == nums[end-]: # 相同元素直接跳过
end -=
start +=
end -=
return res
改进
上面的算法,在实现之后效率太低,以至于运行结果之超过了百分之10的用户。但是由于自己也想不出什么好的办法,因此取讨论区看了别人的写法,不得不说确实很厉害。下面写上别人给出了一个解决方法,这个方法可以解决N数和的问题。
解决思路以及代码
这个问题他的解决思路主要是通过分解,将N数和的问题转化为两数和的问题(递归),并且通过传递变量来记录满足结果的条件。
def fourSum(self, nums, target):
nums.sort()
results = []
self.findNsum(nums, target, , [], results) #因为本题是4数之和的问题,所以传入的参数是4,并且将保存满足条件的数字的变量进行传递
return results def findNsum(self, nums, target, N, result, results):
if len(nums) < N or N < : return # 数组的长度小于N(N数之和)时或者小于2时,直接返回条件。
# solve -sum
if N == : # 当N == 2 时,进行判断, 里面的步骤和三数问题中的步骤一样。
l,r = ,len(nums)-
while l < r:
if nums[l] + nums[r] == target:
results.append(result + [nums[l], nums[r]])
l +=
r -=
while l < r and nums[l] == nums[l - ]:
l +=
while r > l and nums[r] == nums[r + ]:
r -=
elif nums[l] + nums[r] < target:
l +=
else:
r -=
else: # N大于2时进行递归,分解
for i in range(, len(nums)-N+): # careful about range # 第一个指针位置
if target < nums[i]*N or target > nums[-]*N: # 意外情况判定,因为数组是已经排好序的,当第一个元素(最小)乘
break # 以N时,还比target大,那说明,后面的都不满足,直接返回。后面同理。
if i == or i > and nums[i-] != nums[i]: #recursively reduce N #从第一个看是遍历,并将相应额结果进行传递。
self.findNsum(nums[i+1:], target-nums[i], N-1, result+[nums[i]], results)
return
【LeetCode每天一题】4Sum(4数之和)的更多相关文章
- LeetCode每天一题之两数之和
这个LeetCode刷题系列的博客权当是为自己记一下笔记吧.博客系列会从LeetCode的第一题开始刷,同时会从零开始学习[因为我就是零/(ㄒoㄒ)/~~].同时,如果有写错的地方,希望大佬们在评论区 ...
- leetcode第15题:三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- Leetcode第1题:两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素.示例:给定 nums ...
- 【LeetCode】18. 4Sum 四数之和
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:four sum, 4sum, 四数之和,题解,leet ...
- LeetCode(1): 两数之和
本内容为LeetCode第一道题目:两数之和 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 19:57:18 201 ...
- LeetCode:最接近的三数之和【16】
LeetCode:最接近的三数之和[16] 题目描述 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这 ...
- Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)
Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted) 给定一个已按照升序排列 的有序数组,找到两个数使得它们 ...
- LeetCode刷题 - (01)两数之和
题目描述 给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...
- 【LeetCode刷题】——两数之和.1
---恢复内容开始--- 一直想在leetcode上面刷题,但是java刚刚摸了一下门,所以迟迟没有动手,今天做了第一道题,感觉自己实在菜的不行,但是还是学到了很多东西, 就记录一下遇到的问题. 首先 ...
- C#LeetCode刷题之#15-三数之和(3Sum)
目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3618 访问. 给定一个包含 n 个整数的 ...
随机推荐
- Android热门网络框架Volley详解[申明:来源于网络]
Android热门网络框架Volley详解[申明:来源于网络] 地址:http://www.cnblogs.com/caobotao/p/5071658.html
- Docker Compose一键部署Nginx反向代理Tomcat集群
目录结构如下 mysql/conf/my.cnf [mysqld] user=mysql port=3306 datadir=/var/lib/mysql socket=/var/lib/mysql/ ...
- ELK(Elasticsearch6.0以上版本head插件安装)
参考:https://www.cnblogs.com/Onlywjy/p/Elasticsearch.html Elasticsearch6.0不能使用命令直接安装head插件 修改配置文件/etc/ ...
- db2 cpu使用率高问题分析处理
性能调优步骤 明确问题->收集数据->分析数据->细化.定位问题->优化 环境: db2 问题:%usr CPU高,大约99%,db2sysc进程使用的最多 收集数据 ---系 ...
- 基于pygame的一个小游戏
class GameStats(): """跟踪游戏的统计信息""" #def __int__(self, ai_settings): de ...
- [No0000159]C# 7 中的模范和实践
关键点 遵循 .NET Framework 设计指南,时至今日,仍像十年前首次出版一样适用. API 设计至关重要,设计不当的API大大增加错误,同时降低可重用性. 始终保持"成功之道&qu ...
- [No0000DF]C# ZipFileHelper ZIP类型操作,压缩解压 ZIP 类封装
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...
- 1.7Oo局部变量和成员变量执行顺序
import java.util.Scanner; public class booleann { private float fWidth; private float fHeight; void ...
- instrument之Time Profiler总结
一.工欲善其事必先利其器 time profile时间分析工具用来检测应用CPU的使用情况,可以看到应用程序中各个方法正在消耗CPU时间,使用大量CPU不一定是个问题.客户端中动画就对CPU依赖就非常 ...
- C#查找字符串位置
int i=zifuchuan.IndexOf(","); int n=(zifuchuan.SubString(i+1)).IndexOf(","); int ...