左右最值最大差
题目描述
给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0..K],右部分A[K+1..N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?
给定整数数组A和数组的大小n,请返回题目所求的答案。
测试样例
[2,7,3,1,1],5
返回:6
代码
- 这一题思路很巧妙:先找最大值maxnum(这个最大值肯定是某一边的最值),再对比两个端点处(A[0]与A[n-1])的数值,数值大的与maxnum在一边,数值小的就是另一边的最值(假设A[n-1] < A[0],那么A[n-1]就是右边的最值。因为继续往左扩充,如果A[n-2] < A[n-1],那么右边的最大值依然是A[n-1],如果A[n-2] > A[n-1],那么显然右侧只包含A[n-1]一个元素时,左部分中的最大值减去右部分最大值的绝对值最大,最值依然是A[n-1]),求得的这两个值的差值就是答案。
1
2
3
4
5
6
7
8
9
10
11
12
13
14# -*- coding:utf-8 -*-
class MaxGap:
def findMaxGap(self, A, n):
maxnum = max(A)
minnum = min(A[0], A[n - 1])
return maxnum - minnum
maxgap = MaxGap()
print maxgap.findMaxGap([2, 7, 3, 1, 1], 5)
# 运行时间:40ms
# 占用内存:3156k
年终奖
题目描述
小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6 x 6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。
给定一个6 x 6的矩阵board,其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值,保证每个礼物价值大于100小于1000。
代码
- 典型的动态规划算法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# -*- coding:utf-8 -*-
class Bonus:
def getMost(self, board):
for i in range(6):
for j in range(6):
board[i][j] += max(board[i][j - 1] if j > 0 else 0, board[i - 1][j] if i > 0 else 0)
return board[5][5]
bonus = Bonus()
print bonus.getMost([[200, 700, 300, 100, 100, 400], [200, 700, 300, 100, 100, 400], [200, 700, 300, 100, 100, 400],
[200, 700, 300, 100, 100, 400], [200, 700, 300, 100, 100, 400], [200, 700, 300, 100, 100, 400]])
# 输出5300
# 运行时间:30ms
# 占用内存:3156k
最长公共子序列
题目描述
对于两个字符串,请设计一个高效算法,求他们的最长公共子序列的长度,这里的最长公共子序列定义为有两个序列U1,U2,U3…Un和V1,V2,V3…Vn,其中Ui<Ui+1,Vi<Vi+1。且A[Ui] == B[Vi]。
给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。
测试样例
“1A2C3D4B56”,10,”B1D23CA45B6A”,12
返回:6
代码
- 动态规划,将公共长度存到ans[N+1][M+1]数组中,求ans[i][j]。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# -*- coding:utf-8 -*-
class LCS:
def findLCS(self, A, n, B, m):
ans = [[0 for i in range(m + 1)] for j in range(n + 1)] # 这样初始化不用考虑[i-1]和[j-1]是否越界的问题
for i in range(1, n + 1):
for j in range(1, m + 1):
if A[i - 1] == B[j - 1]:
ans[i][j] = ans[i - 1][j - 1] + 1
else:
ans[i][j] = max(ans[i][j - 1], ans[i - 1][j])
return ans[n][m]
# 运行时间:240ms
# 占用内存:3148k
lcs = LCS()
print lcs.findLCS("1A2C3D4B56", 10, "B1D23CA45B6A", 12)