算法题 21 findNSum (好未来,LeetCode,牛客网)
一、三数之和:LeetCode 15
给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题代码一:
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result=[]
nums.sort()
for i in range(len(nums)-2):
#下标i表示三个数中的第一个数
if i>0 and nums[i]==nums[i-1]:#遇到重复的数就直接跳过,避免重复计算三元组
continue
#下标j表示三个数中的第二个,从i+1开始递增;下标k表示三个数中的第三个,从len(nums)-1递减
j,k=i+1,len(nums)-1
while j<k:
sum0=nums[i]+nums[j]+nums[k]
if sum0<0:
j+=1
elif sum0>0:
k-=1
else:
result.append([nums[i],nums[j],nums[k]])
#如果此时j和后面的数重复,k和前面的数重复记得要直接跳过
while j<k and nums[j+1]==nums[j]:
j+=1
while j<k and nums[k-1]==nums[k]:
k-=1
j+=1
k-=1
return result
解题代码二:更通用,适用于Nsum
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
""" # method 2:通用方法 nums.sort()
results=[]
self.findNSum(nums,0,3,[],results)
return results def findNSum(self,nums,target,N,result,results):
if N<2 or len(nums)<N or target<nums[0]*N or target>nums[-1]*N:
return
if N==2:
j,k=0,len(nums)-1
while j<k:
s=nums[j]+nums[k]
if s<target:
j+=1
elif s>target:
k-=1
else:
results.append(result+[nums[j],nums[k]])
while j<k and nums[j+1]==nums[j]:
j+=1
while j<k and nums[k-1]==nums[k]:
k-=1
j+=1
k-=1
else:
# 共有len(nums)-N+1个N元组
for i in range(len(nums)-N+1):
if i==0 or (i>0 and nums[i-1]!=nums[i]):
self.findNSum(nums[i+1:],target-nums[i],N-1,result+[nums[i]],results)
return
二、四数之和 LeetCode
给定一个包含 n 个整数的数组 nums
和一个目标值 target
,判断 nums
中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target
相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
解题代码:(通用,适合于NSum)
class Solution:
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort()
results=[]
self.findNSum(nums,target,4,[],results)
return results def findNSum(self,nums,target,N,result,results):
if N<2 or len(nums)<N or target<nums[0]*N or target>nums[-1]*N:
return
if N==2:
j,k=0,len(nums)-1
while j<k:
s=nums[j]+nums[k]
if s<target:
j+=1
elif s>target:
k-=1
else:
results.append(result+[nums[j],nums[k]])
while j<k and nums[j+1]==nums[j]:
j+=1
while j<k and nums[k-1]==nums[k]:
k-=1
j+=1
k-=1
else:
# 共有len(nums)-N+1个N元组
for i in range(len(nums)-N+1):
if i==0 or (i>0 and nums[i-1]!=nums[i]):
self.findNSum(nums[i+1:],target-nums[i],N-1,result+[nums[i]],results)
return
三、牛客网 求和
链接:https://www.nowcoder.com/questionTerminal/11cc498832db489786f8a03c3b67d02c
来源:牛客网
输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
输入描述:
每个测试输入包含2个整数,n和m
输出描述:
按每个组合的字典序排列输出,每行输出一种组合
输入
5 5
输出
1 4
2 3
5
解法一:改造NSum
n, m = [int(x) for x in input().split()] def findNSum(nums, target, N, result, results):
if N < 2 or len(nums) < N or target < nums[0]*N or target > nums[-1]*N:
return
if N == 2:
j, k = 0, len(nums)-1
while j < k:
s = nums[j]+nums[k]
if s < target:
j += 1
elif s > target:
k -= 1
else:
results.append(result+[nums[j], nums[k]])
while j < k and nums[j+1] == nums[j]:
j += 1
while j < k and nums[k-1] == nums[k]:
k -= 1
j += 1
k -= 1
else:
# 共有len(nums)-N+1个N元组
for i in range(len(nums)-N+1):
if i == 0 or (i > 0 and nums[i-1] != nums[i]):
findNSum(nums[i+1:], target-nums[i],
N-1, result+[nums[i]], results)
return results = []
nums = range(1, n+1)
for i in range(1, n+1):
if i == m:
results.append([i])
for i in range(2, n+1):
findNSum(nums, m, i, [], results)
res=sorted(results)
for arr in res:
for i in range(len(arr)):
if i==len(arr)-1:
print(arr[i])
else:
print(arr[i],end=' ')
解法三:DFS 递归
n,m=[int(x) for x in input().split()] def dfs(res,s,temp,n,m,k):
if s==m:
if temp not in res:
res.append(temp)
for i in range(len(temp)):
if i!=len(temp)-1:
print(temp[i],end=' ')
else:
print(temp[i])
if k>n:
return
for i in range(k,n+1):
if s+i>m:
break
else:
dfs(res,s+i,temp+[i],n,m,i+1)
res=[]
dfs(res,0,[],n,m,1)
算法题 21 findNSum (好未来,LeetCode,牛客网)的更多相关文章
- 算法题16 贪吃的小Q 牛客网 腾讯笔试题
算法题16 贪吃的小Q 牛客网 腾讯笔试题 题目: 链接:https://www.nowcoder.com/questionTerminal/d732267e73ce4918b61d9e3d0ddd9 ...
- 算法题 19 二叉平衡树检查 牛客网 CC150
算法题 19 二叉平衡树检查 牛客网 CC150 实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1. 给定指向树根结点的指针TreeNode* ro ...
- 牛客网《BAT面试算法精品课》学习笔记
目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
- 算法题14 小Q歌单,牛客网,腾讯笔试题
算法题14 小Q歌单,牛客网,腾讯笔试题 题目: 小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌 ...
- 算法题 18 像素翻转 牛客网 CC150
算法题 18 像素翻转 牛客网 CC150_P114 题目描述 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时 ...
- [牛客网 -leetcode在线编程 -01] max-points-on-a-line -穷举
题目及题目来源 链接:https://www.nowcoder.com/questionTerminal/bfc691e0100441cdb8ec153f32540be2 来源:牛客网 首页 > ...
- 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅
链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...
- 牛客网刷题(纯java题型 31~60题)
牛客网刷题(纯java题型 31~60题) 重写Override应该满足"三同一大一小"三同:方法名相同,参数列表相同,返回值相同或者子类的返回值是父类的子类(这一点是经过验证的) ...
随机推荐
- The Definitive Guide To Django 2 学习笔记(二) 第二个View 动态内容
“Hello World”只是简单的展现了Django 基本的工作机制,但它不是动态的网页.第二个View我们将创建一个动态的网页,该页面上将展现当前的时间和日期. 该View需要做两件事,第一,计算 ...
- [原创]OpenERP 7.0 打印PDF报表 中文 乱码问题的解决方案。
网上的解决方案基本上以替换字体和安装上海先锋科技开发的软件包配置两种方案,替换字体的方案尝试了几次都么有成功,安装软件包的方案成功. 软件环境:Ubuntu Server 12.04 第一步:先到ht ...
- vsftpd服务tar包安装
一般如果有网络ubuntu直接apt-get install 安装vsftpd服务即可. 没网络只能下好vsftpd的tar包自己安装配置. 1. 解压 tar -xvf vsftpd-3.0.2.t ...
- 小型web服务器thttpd的学习总结(下)
1.主函数模块分析 对于主函数而言,概括来说主要做了三点内容,也就是初始化系统,进行系统大循环,退出系统.下面主要简单阐述下在这三个部分,又做了哪些工作呢. 初始化系统 拿出程序的名字(argv[0] ...
- [转]JVM内存溢出的几种方式比较
转载自:https://github.com/pzxwhc/MineKnowContainer/issues/25 包括: 1. 栈溢出(StackOverflowError) 2. 堆溢出(OutO ...
- 使用Net.Sockets.TcpListener和Net.Sockets.TcpClient进行图片传输时怎样精确控制接收缓存数组大小
<span style="font-size:18px;">在dotnet平台Net.Sockets.TcpListener和Net.Sockets.TcpClient ...
- Chrome开发者工具之Network面板
Chrome开发者工具面板 面板上包含了Elements面板.Console面板.Sources面板.Network面板. Timeline面板.Profiles面板.Application面板.Se ...
- Sublime Text 加入右键菜单
Sublime Text 2 是现在很受大家欢迎的编辑器了,不仅是在web前端,在书定简单的php.Js等代码时,也是相当的好用,再配合多种的插件和新颖的界面,更是让人欲罢不能. 在使用时,我们通过喜 ...
- Storm集成Kafka编程模型
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3974417.html 本文主要介绍如何在Storm编程实现与Kafka的集成 一.实现模型 数据流程: ...
- sql 注入入门
=============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关 ...