一、三数之和: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
输出描述:
按每个组合的字典序排列输出,每行输出一种组合
示例1

输入

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,牛客网)的更多相关文章

  1. 算法题16 贪吃的小Q 牛客网 腾讯笔试题

    算法题16 贪吃的小Q 牛客网 腾讯笔试题 题目: 链接:https://www.nowcoder.com/questionTerminal/d732267e73ce4918b61d9e3d0ddd9 ...

  2. 算法题 19 二叉平衡树检查 牛客网 CC150

    算法题 19 二叉平衡树检查 牛客网 CC150 实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1. 给定指向树根结点的指针TreeNode* ro ...

  3. 牛客网《BAT面试算法精品课》学习笔记

    目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...

  4. 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类

    不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...

  5. 算法题14 小Q歌单,牛客网,腾讯笔试题

    算法题14 小Q歌单,牛客网,腾讯笔试题 题目: 小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌 ...

  6. 算法题 18 像素翻转 牛客网 CC150

    算法题 18 像素翻转 牛客网 CC150_P114 题目描述 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时 ...

  7. [牛客网 -leetcode在线编程 -01] max-points-on-a-line -穷举

    题目及题目来源 链接:https://www.nowcoder.com/questionTerminal/bfc691e0100441cdb8ec153f32540be2 来源:牛客网 首页 > ...

  8. 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...

  9. 牛客网刷题(纯java题型 31~60题)

    牛客网刷题(纯java题型 31~60题) 重写Override应该满足"三同一大一小"三同:方法名相同,参数列表相同,返回值相同或者子类的返回值是父类的子类(这一点是经过验证的) ...

随机推荐

  1. MVVM 实战之计算器

    MVVM 实战之计算器 android DataBinding MVVM calculator Model View 布局文件 Fragment ViewModel 结束语 前些日子,一直在学习基于 ...

  2. Oracle 错误 maximum number of processes(150) exceeded 解决办法

    网上很多同行应该都遇到过这个问题,百度一搜 千篇一律的处理办法,就是加大进程数. 但是我这边情况不一样,因为我的Oracle 11g是早上刚装的,跟本没人用,我用PLSQL链接照样说不能链接. 我就在 ...

  3. PAT003 List Leaves

    题目: Given a tree, you are supposed to list all the leaves in the order of top down, and left to righ ...

  4. Docker 和一个正常的虚拟机有何区别?

    问: 我多次重读Docker.io文档,希望搞明白Docker.io和一个完全的虚拟机的区别.Docker是如何做到提供一个完整的文件系统,独立的网络环境等等这些功能,同时还没有如此庞大? 为什么部署 ...

  5. Apollo 刨析:Localization

    九月 30 2014 11:27 上午     admin 0 Comments 今天我们来看一看Apollo中的Localization Component. 本地化在Apollo中的使用 像这样的 ...

  6. 【BZOJ】1596: [Usaco2008 Jan]电话网络(树形dp+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1596 一开始交了个貌似正确的dp,wa了. 我只考虑了儿子覆盖的情况,没有考虑父亲QAQ 那么我们要 ...

  7. js事件循环机制(Event Loop)

    javascript从诞生之日起就是一门  单线程的  非阻塞的  脚本语言,单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务,非阻塞靠的就是 event lo ...

  8. 【python】模块测试 if name main

    verbose=1 def listing(module): if verbose: print '-'*30 print 'name:',module.__name__,'file:',module ...

  9. dubbo 序列化 问题 属性值 丢失 ArrayList 解决

    参考文章:http://blog.csdn.net/wanyanxgf/article/details/6944733 http://tianya23.blog.51cto.com/1081650/5 ...

  10. 【BZOJ4503】两个串 FFT

    [BZOJ4503]两个串 Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字 ...