寻找和为定值的两个或多个数

找出哪几个数值的和接近目标值 找出哪几个数值的和接近目标值,给定一组数,找出和接近目标值的所有组合。 立即下载

一、寻找和为定值的两个数

题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

详情参考http://blog.youkuaiyun.com/v_july_v/article/details/6419466

用一个hash表,储存每一个数的下标。时间复杂度O(N),空间复杂度为O(N).

#!/usr/bin/env python
# -*- coding: utf-8 -*
#查找数组中两个数为指定值的两个数

def twoSum(A, s):
	'''找到数组中和为定值的两个数,返回其对应的下标'''
	l = len(A)
	mHash,res = {},[]
	for i in xrange(l):
		mHash[A[i]] = i
	for i in xrange(l):
		t = s - A[i]
		if mHash.has_key(t):
			res.append(i)
			res.append(mHash[t])
			break
	return res

if __name__ == '__main__':
	A = [1, 2, 4, 7, 11, 15]
	s = 15
	print 'the index are :' ,twoSum(A,s)

方法二:先排序,然后左右夹逼。排序O(N*logN),夹逼O(N),总的时间复杂度为O(N*logN),空间复杂度为O(1)。 也可以采用二分查找,但是总的时间复杂度不变。

#!/usr/bin/env python
# -*- coding: utf-8 -*
#查找数组中两个数为指定值的两个数
def partition(s, m, n):
	#s is a list
	key = s[n-1]
	l,r = m,n-2
	while True:
		while l <= n-2 and s[l] <= key:
			l += 1
		while r>= m and  s[r] > key:
			r -= 1
		if l < r:
			s[l],s[r] = s[r],s[l]
		else:
			break
	s[l],s[n-1] = s[n-1],s[l]
	return l

def medin3(s, m, n):
	md = m + (n-m)/2
	if s[m] > s[md]:
		s[m],s[md] = s[md],s[m]
	if s[m] > s[n]:
		s[m],s[n] = s[n],s[m]
	if s[md] > s[n]:
		s[md],s[n] = s[n],s[md]
	s[md],s[n-1] = s[n-1],s[md]
	return s[n-1]

def quicksort(s, m, n):
	#s is a list
	if m < n:
		medin3(s, m, n)
		k = partition(s, m, n)
		quicksort(s, m, k)
		quicksort(s, k+1, n)

def twoSumd(A, s):
	'''快速排序,夹逼, 返回两个数'''
	lens = len(A)
	quicksort(A, 0, lens-1)
	l,r = 0,lens-1
	while l<r:
		if A[l] + A[r] < s:
			l += 1
		elif A[l] + A[r] > s:
			r -= 1
		else:
			return (A[l],A[r])
	return False


if __name__ == '__main__':
	A = [1, 2, 4, 7, 11, 15]
	s = 15
	print 'the index are :' ,twoSumd(A,s)



二、寻找和为定值的多个数

题目:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来

#!/usr/bin/env python
# -*- coding: utf-8 -*
#查找数组中和为指定值的多个数
mlist = []
def find_factor(s, n):
	'''找到和为s的1...n中的序列'''
	if n <= 0 or s <= 0:
		return ;
	if s == n:
		print n,
		for i in mlist:
			print ' + ', i,
		print '\n'
	mlist.insert(0, n)
	find_factor(s-n, n-1)   #包含有n的序列
	del mlist[0]
	find_factor(s, n-1)     #不包含有n的序列
		
if __name__ == '__main__':
	m = int(raw_input('input the sum :'))
	n = int(raw_input('input the n :'))
	find_factor(m, n)



剑指Offer(Python多种思路实现):和为s的数字 剑指Offer(Python多种思路实现):和为s的数字 面试57题: 题目:和为s的数字 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 解题思路一:使用while循环从两端向中间扫描数组,时间复杂度为O(n) class Solution: def FindNumbersWithSum(self, array, tsum): # write code here if len(array)<2: return [] fo 立即下载

相关推荐

Snort源代码编译 _ 采坑之旅(for Windows VS2015)

    系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《...

magictong的专栏 8887

Python 无序数组中找出和为特定值的几个数

先放代码 from itertools import combinations def main(lists,value): d = lists for i in range(len(d)): for c in list(combinations(d, i+1)): s=sum(c) if s==value: print(c) if __name__ == "__main__": li

weiwei9504的博客 1980

大白话讲解Numpy中什么是一维、二维、三维数组,以及5种创建方式

NumPy中提供了多种创建数组的方式,其中最基本的方式就是通过array()函数创建数组在使用该函数时直接传入列表或元组即可。 通过array()函数分别创建一维数组、二维组和三维数组,那么什么是维度呢?一维、二维、三维有什么区别? 1、什么是维度? 维度可以理解为描述数据的一种 “方向” 或者 “层次”。在数组中,维度的数量决定了我们需要用多少个索引来访问一个元素 2、一维、二维、三维的区别? (1)一维:一维数组就像是一条直线上排列的一组数据,例如: a = np.array([1, 2

1361

七:寻找和为定值的多个数

1:n问题转换为n-1问题 list&lt;int&gt; list1; void SumOfkNumber(int sum, int n) { // 递归出口 if (n &lt;= 0 || sum &lt;= 0) { return; } // 输出找到的结果 if (sum == n) { // 反转...

ndzjx的专栏 443

【GAMES201学习笔记】物质点法入门

《GAMES201》 学习笔记

捕鱼维的个人小站 9198

WGCNA样本量不够怎么办?5种替代方案帮你解决小样本基因共表达分析难题

本文针对WGCNA样本量不足的问题,提供了5种科学替代方案,包括CEMiTool、参数调整、多组学数据整合、机器学习特征提取和公共数据利用。这些方法帮助研究者在小样本条件下仍能进行可靠的基因共表达分析,特别适用于罕见病和珍贵临床样本研究。

weixin_42554042的博客 301

Python——无序数组中找出和为N的两个数(三个数、四个数)

          Python——无序数组中找出和为N的两个数(三个数、四个数) 【问题描述】无序数组中找出和为N的两个数,例如,nums = [1, 4, 3, 2, 6, 5]中找出和为target = 6的序列,答案:[(1, 5), (4, 2)]。 参考博客: 1、一个无序数组中两个数之和等于给定的值sum 2、Python算法题----在列表中找到和为s的两个数字 输入:...

GeekZW的博客 2万+

深度强化学习算法PPO训练Pendulum

returnadv = 0print('状态空间维度:', state_n)print('动作空间维度:', action_n)steps = []if done:breakif done:breakelse:steps = []if done:break。

weixin_43336108的博客 808

程序员编程艺术:第五章、寻找满足和为定值的两个或多个数

程序员编程艺术:第五章、寻找和为定值的两个或多个数     作者:July,yansha,zhouzhenren。    致谢:微软100题实现组,编程艺术室。    微博:http://weibo.com/julyweibo   。    出处:http://blog.youkuaiyun.com/v_JULY_v  。    wiki:http://tctop.wikispaces.com/。------

结构之法 算法之道 7万+

rk3588调试imx415记录

分享适配imx415的软件配置以及一些关键的调试命令

m0_60805802的博客 2888

Python爬虫终极实战:逆向解析+异步处理,高效爬取中关村在线万级产品数据

爬虫工程师的战场,已经从简单的HTML解析,转向了对网络协议、JavaScript执行逻辑的深度逆向工程。然后刷新页面,当浏览器发起这个请求时,执行会暂停,我们可以一步步跟蹤调用栈(Call Stack),找到发起请求前的JavaScript代码,从而发现参数的计算逻辑。它们会添加一个动态的、一次性的签名(token)或加密参数,用于验证请求的合法性。这是整个爬虫最核心、最具技术含量的部分。的请求,其响应体正是结构清晰的JSON数据,包含了当前页面的所有手机信息(产品ID、名称、价格、图片等)。

2201_76125261的博客 429

寻找和为定值的多个数

问题: 1. 找出一个序列中和为sum的两个数 2. 找出一个序列中和为sum的多个数(不限个数) 3. 找出一个序列中和为sum的4个数解析:1. 找出一个序列中和为sum的两个数 将序列排序 用左右2个指针指向序列的头部和尾部 如果当前2个指针指向数的当前和等于sum,则这两个数是一个结果;如果当前和小于sum,说明当前和应该大一点,则将左指针右移 1 位;如果当前和大于sum,说明当前和

quinn的专栏 1836

使用 Simulink 和 Simscape Electrical 工具箱设计一个 Buck 转换器系统

Buck 转换器(降压转换器)是一种常用的 DC-DC 转换器,用于将较高的输入电压转换为较低的输出电压。为了评估其抗干扰能力,我们可以在模型中引入不同的干扰源,并观察系统的响应情况。电网电压波动:输入电压的变化。负载突变:负载电阻或电感的变化。电磁干扰:高频噪声或脉冲干扰。通过模拟这些干扰,我们可以分析系统的动态响应特性,并采取相应的措施来提高系统的抗干扰能力。

xiaoheshang_123的博客 377

(10)寻找满足和为定值的两个或多个数

程序员编程艺术:第五章、寻找和为定值的两个或多个数       作者:July,yansha,zhouzhenren。     致谢:微软100题实现组,编程艺术室。     微博:http://weibo.com/julyweibo   。     出处:http://blog.youkuaiyun.com/v_JULY_v  。     wiki:http://tctop.wikispac

dangzhileiqaz的专栏 948

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【程序员编程艺术】第五章:寻找满足和为定值的两个或多个数

题目描述 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(N)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

solar一抹阳光的专栏 1496

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

005寻找满足和为定值的两个或多个数

题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 分析:

dongqing0812的专栏 718

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

第五章:寻找满足和为定值的两个或多个数

第一节、寻找和为定值的两个数、三个数、四个数 题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 参见:LeetCode 2.1.7 Two Sum  2.1.8 3S

王川的私房菜 1795

第五章、寻找满足和为定值的两个或多个数

原链接:http://blog.youkuaiyun.com/v_JULY_v/article/details/6419466 1、如果在返回找到的两个数的同时,还要求你返回这两个数的位置列? 2、如果把题目中的要你寻找的两个数改为“多个数”,或任意个数列?(请看下面第二节) 3、二分查找时: left   //算法所操作的区间,是左闭右开区间,还是左闭右闭区间,这个区间,需要在循环初始化

我的E家 996

程序员编程艺术 第五章 寻找满足和为定值的两个或多个数

程序员编程艺术 第五章 寻找满足和为定值的两个或多个数

gdfyug的博客 179

程序员编程艺术---5、寻找满足和为定值的两个或多个数

1、寻找和为定值的两个数 题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的数字。 解析:(1)可以用穷举法,从数组中任取两个数,看其和是否是该数字。但是O(N)=O(n^2) (2)可以同时从数组首元素a[i] 和尾元素a[j] 之和遍历,如果>sum,j--; 如果 #include "stdafx.h" #include using namespace s

HeHui的专栏 1884
上一篇: 寻找最小的K个数 python实现
下一篇: python中字典的常用方法
「已注销」
博客等级 码龄15年 5粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值