本文目录一览:
python算法编程题,求代码
这道题的核心在于设计算法: 根据描述:这道题的编程思路应该是这样的:任意三个数的和除以2=剩余三个数中的任意两数的平均值=游戏机的价格。 可以这样做,把六个数放入数组中,做一个多层嵌套循环遍历所有组合,当满足上述条件时执行一个返回结果的动作,可能有不止一个答案。
Python 算法 2022-06-23
描述:一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
给定一个数组 arr
代表得分数组,请返回最少需要多少糖果
描述:有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti
,第 i 个活动的结束时间是 endi
,举办某个活动就需要为该活动准备一个活动主持人。
一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti, endi)
这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。
输入:
2,[[1,2],[2,3]]
返回值:
1
说明: 只需要一个主持人就能成功举办这两个活动 输入:
2,[[1,3],[2,4]]
返回值:
2
说明:
需要两个主持人才能成功举办这两个活动
描述:假设你有一个数组 prices
,长度为 n
,其中 prices[i]
是股票在第 i
天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
- 你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出前面的某一天
- 如果不能获取到任何利润,请返回
0
- 假设买入卖出均无手续费
数据范围:
0 <= n <= 10^5
,0 <= val <= 10^4
要求:空间复杂度O(1)
,时间复杂度O(n)
描述:假设你有一个数组prices
,长度为n
,其中prices[i]
是某只股票在第i
天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 这里的buy2
以及profit2
如何更新? - 只有一个数出现奇数次,其它数出现偶数次
- 共有两个数出现奇数次,其它数目出现偶数次
eor & (~eor + 1)
Python 算法
什么是算法
“算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。”
在谈到算法时,我们不得不去了解一下什么是时间复杂度和空间复杂度这两个概念
计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。时间复杂度常用大 O 符号(大 O 符号(Big O notation)是用于描述函数渐进行为的数学符号。)
空间复杂度:它是用来评估算法内存占用大小的一个式子。
Python 算法的几大重要特征
Python 算法除了具有以上特征,还和时间和空间有关系,不同的算法可能用不同的时间、空间或效率来完成同样的任务,因此,一个 Python 算法的优劣可以用空间复杂度与时间复杂度来衡量。
通过实例加深对算法的理解
如题所示:
要求 x
, y
, z
的 1000 以内取值满足 x^2 + y^2 = z^2
,同时 x + y + z = 1000
,求解出所有 x
, y
, z
的组合情况?
求解过程如下:
这里使用了一个 waste_time
方法作为装饰器来计算装饰过的方法的执行时间,这里有两种算法来求解这个问题
代码如下:
总结:
通过这个示例,对于同一个问题给出两种不同的算法,两种算法在执行过程中我增加了对程序执行时间的统计,通过时间上的对比发现两个算法的执行时间相差非常的大,如响应结果所示。
由此我们可以得出一个结论,就是实现不同的算法程序执行的时间可以反应出算法的效率,即算法有优劣之分,好的算法可以节约时间,提高效率,反之则不然。
Python之动态规划算法
动态规划算法中是将复杂问题递归分解为子问题,通过解决这些子问题来解决复杂问题。与递归算法相比,动态编程减少了堆栈的使用,避免了重复的计算,效率得到显著提升。
先来看一个简单的例子,斐波那契数列。
斐波那契数列的定义如下。
斐波那契数列可以很容易地用递归算法实现:
上述代码,随着 n
的增加,计算量呈指数级增长,算法的时间复杂度是 O(2^n)
。
采用动态规划算法,通过自下而上的计算数列的值,可以使算法复杂度减小到 O(n)
,代码如下。
下面我们再看一个复杂一些的例子。
这是小学奥数常见的硬币问题:已知有 1 分,2 分,5 分三种硬币数量不限,用这些硬币凑成为 n
分钱,那么一共有多少种组合方法。
我们将硬币的种类用列表 coins
定义;
将问题定义为一个二维数组 dp
,dp[amt][j]
是使用 coins
中前 j+1
种硬币 (coins[0:j+1]
) 凑成总价 amt
的组合数。
例如:coins = [1,2,5]
dp[5][1]
就是使用前两种硬币 [1,2]
凑成总和为 5 的组合数。
对于所有的 dp[0][j]
来说,凑成总价为 0 的情况只有一种,就是所有的硬币数量都为 0。所以对于在有效范围内任意的 j
,都有 dp[0][j]
为 1
。
对于 dp[amt][j]
的计算,也就是使用 coins[0:j+1]
硬币总价 amt
的组合数,包含两种情况计算:
- 当使用第
j
个硬币时,有dp[amt - coins[j]][j]
种情况,即amt
减去第j
个硬币币值,使用前j+1
种硬币的组合数; - 当不使用第
j
个硬币时,有dp[amt][j-1]
种情况,即使用前j
种硬币凑成amt
的组合数; 所以:dp[amt][j] = dp[amt - coins[j]][j] + dp[amt][j-1]
我们最终得到的结果是:dp[amount][-1]
上述分析省略了一些边界情况。 有了上述的分析,代码实现就比较简单了。 动态规划算法代码简洁,执行效率高。但是与递归算法相比,需要仔细考虑如何分解问题,动态规划代码与递归调用相比,较难理解。 我把递归算法实现的代码也附在下面。有兴趣的朋友可以比较一下两种算法的时间复杂度有多大差别。 上述代码在 Python 3.7 运行通过。
求Python大神解答
最后的输出语句已经限定了函数名是 gcd
函数里的算法是求最大公约数的辗转相除法。辗转相除法是一个循环处理过程,所以第二个是 while
同理,最后 return
的应该是 n
def gcd(m, n):
r = m % n
while r:
m = n
n = r
r = m % n
else:
return n