一.贪心算法问题:根据身高重建队列
假设有打乱顺序的一群人站成一个队列.每个人由整数对(h,k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数,编写一个算法来重建这个队列
代码示例如下:
arr = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] #初始状态
"""
思考过程如下:
7,0
7,0 7,1
7,0 6,1 7,1
5,0 7,0 6,1 7,1
5,0 7,0 5,2 6,1 7,1
5,0 7,0 5,2 6,1 4,4 7,1
"""
#[h,k] h为身高 k排在h前且升高大于h的人数
#结果要为[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
arr.sort(key=lambda arr:arr[0],reverse=True)
print(arr)
arr_end = []
for i in arr:
a = i[1]
arr_end.insert(a,i)
print(arr_end)
2.动态规划问题:三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和,每一步只能移动到下一个相邻节点上.
代码示例如下:
arr = [
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
def min_path(arr):
min_jend = 0
for i in arr:
min_j = min(i)
min_jend += min_j
return min_jend
min_end = min_path(arr)
print('最短路径为:',min_end)
3.动态规划问题:合唱团(网易笔试编程)
有n个学生战成一排,每一个学生有一个能力值,牛牛想从这n个学生中按照顺序选取k名学生,要求相邻两个学生的位置编号的差不能超过d,使得k个学生的能力乘积最大,
输入描述:
每一个输入包含一个测试用例,每个测试数据包含一个整数n(1<=n<=50),表示学生的个数;接下来的一行,包含n个整数按照每个学生的能力值aj(-50<=aj<=50);接下来的一行包含两个整数,k\和d(1 <= k <= 10,1 <= d <= 50).
代码案例如下:
student_amount = [3]
abil = [7,4,7]
k_d = [2,50]
num = k_d[0]
max_pro = 1
for i in range(num):
if len(student_amount) <= k_d[1]:
max_abil = abil.index(max(abil))
max_pop = abil.pop(max_abil)
max_pro *= max_pop
print(max_pro)
4.不同排序算法应用问题
排序的优化原则
- 需要被排序的总数比较小的时候,适合插入排序和选择排序;
- 需要被排序的总数很大的时候,建议使用归并[排序
- 需要被排序的数据基本有序的时候,适合直接插入排序调整一下即可
- 有重复且范围比较小或者位数比较固定,考虑基数排序或者桶排序