deffind_max(a): for i inrange(len(a)): if a[i] == max(a): return i, a[i]
deffunc(a): i, Max = find_max(a) res.append(Max) iflen(a) == 1: return0 if i == 0: res.append("null") else: func(a[:i]) if i == len(a) - 1: res.append("null") else: func(a[i + 1:])
num = input().split() for i inrange(len(num)): num[i] = int(num[i])
res = [] func(num)
for i inrange(len(res)): res[i] = str(res[i]) print(" ".join(res))
Problem P02. [算法课分治] 寻找多数
给定一个大小为 n 的整型数组 a,找到其中的多数元素,多数元素是指在数组中出现次数大于 ⌊n/2⌋ 的元素。
输入
第一行输入一个整数 n (1 ≤ n ≤ 10^4) 代表数组的长度。
第二行输入一行数字代表数组 a (1 ≤ a_i ≤ 10^4),数字与数字之间用空格间开。
保证给定的数组总是存在多数元素。
输出
输出一个整数代表数组的多数元素。
样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
标准输入: 3 1 1 1 标准输出: 1
标准输入: 7 4 1 2 3 3 3 3 标准输出: 3
标准输入: 9 4 2 2 2 2 21 23 23 2 标准输出: 2
提示
如果数 a 是数组 n 的众数,如果我们将 n 分成两部分,那么 a 必定是至少一部分的众数。
解答
1 2 3 4 5 6 7
temp = input() num = input().split() for i inrange(len(num)): num[i] = int(num[i])
temp = input() arr = input().split() for i inrange(len(arr)): arr[i] = int(arr[i])
pre = 0 maxAns = arr[0]
for i in arr: pre = max(pre + i, i) maxAns = max(maxAns, pre)
print(maxAns)
Problem P04. [算法课分治] 找到 k 个最小数
输入整数数组 arr,找出其中最小的 k 个数。
输入
第一行输入两个整数,第一个代表数组的长度,第二个代表 k,数字与数字之间用空格间开
第二行输入一行数字代表数组 arr。数字与数字之间用空格间开
0 ≤ k ≤ arr.length ≤ 10000
0 ≤ arr[i] ≤ 10000
输出
输出一行整数,表示最小的 k 个数。数字与数字之间用空格间开
样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
标准输入: 3 2 3 2 1 标准输出: 1 2
标准输入: 4 1 0 0 1 1 标准输出: 0
标准输入: 4 2 1 1 3 4 标准输出: 1 1
解答
1 2 3 4 5 6 7 8 9 10 11 12 13
temp = input().split() k = int(temp[1])
arr = input().split() for i inrange(len(arr)): arr[i] = int(arr[i])
arr.sort()
for i inrange(len(arr)): if i >= k: break print(arr[i], end=" ")
Problem P05. [算法课分治] 寻找第 k 个最大元素
给定整数数组 nums 和整数 k,请找到数组中第 k 个最大的元素。
输入
第一行输入两个整数,第一个代表数组的长度,第二个代表 k,数字与数字之间用空格间开
第二行输入一行数字代表数组 nums。数字与数字之间用空格间开
1 ≤ k ≤ nums.length ≤ 1000
-1000 ≤ nums[i] ≤ 1000
输出
输出一个整数代表第 k 个最大元素
样例
1 2 3 4 5 6 7 8 9 10 11 12
标准输入: 6 2 3 2 1 5 6 4 标准输出: 5
标准输入: 9 4 3 2 3 1 2 4 5 5 6 标准输出: 4
解答
1 2 3 4 5 6 7 8 9 10
temp = input().split() k = int(temp[1])
arr = input().split() for i inrange(len(arr)): arr[i] = int(arr[i])
arr.sort()
print(arr[-k])
Problem P06. [算法课分治] 找到 k 个最长重复字符串
在一个字符串 s 中找出 s 中的最长子串,且该字符串的每一个字符出现次数都不少于 k。输出该子串的长度。
输入
第一行有两个输入,第一个输入一串字符串 s,第二个输入整数代表 k,两个输入之间用空格隔开
1 ≤ s.length ≤ 10000
s 仅由小写英文字母组成
0 ≤ k ≤ 1000
输出
输出一个整数,表示该子串的长度
样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
标准输入: aaabb 3 标准输出: 3
标准输入: ababbc 2 标准输出: 5
标准输入: abcde 2 标准输出: 0
提示
第一个样例解释:最长子串为 aaa,其中 a 重复了 3 次。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
temp = input().split() arr = temp[0] k = int(temp[1])
deflongestSubstring(arr, k): ifnot arr: return0 for c inset(arr): if arr.count(c) < k: returnmax(longestSubstring(t, k) for t in arr.split(c)) returnlen(arr)
maxLen = 1 begin = 0 dp = [[False] * n for _ inrange(n)] for i inrange(n): dp[i][i] = True for L inrange(2, n + 1): for i inrange(n): j = L + i - 1 if j >= n: break if s[i] != s[j]: dp[i][j] = False else: if j - i < 3: dp[i][j] = True else: dp[i][j] = dp[i + 1][j - 1] if dp[i][j] and j - i + 1 > maxLen: maxLen = j - i + 1 begin = i print(s[begin:begin + maxLen])
Problem P14. [算法课动态规划]连续数组最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
输入
输入数组长度n (1 <= n <= 50) 依次给数组的元素赋值
输出
输出所有子数组的和的最大值
样例
1 2 3 4 5
标准输入: 9 -2 1 -3 4 -1 2 1 -5 4 标准输出: 6
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14
num = input() arr = input().split() for i inrange(len(arr)): arr[i] = int(arr[i])
dp = [0] * (len(arr) + 1) maxAns = arr[0] pre = 0
for i in arr: pre = max(pre + i, i) maxAns = max(maxAns, pre)
g.sort() s.sort() m = len(g) n = len(s) count = 0 i = 0 j = 0 flag = True while i < m and j < n: while j < n and g[i] > s[j]: j += 1 if j < n: count += 1 i += 1 j += 1
print(count)
Problem P18. [算法课贪婪]6和9组成的最大数字
给你一个仅由数字6和9组成的正整数 num。
你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。
请返回你可以得到的最大数字。
1 <= num <= 10000,即最多4位数
num 每一位上的数字都是 6 或者 9 。
输入
第一行输入一个整数。
输出
第一行输出一个整数代表最大值
样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
标准输入: 9669 标准输出: 9969
标准输入: 9996 标准输出: 9999
标准输入: 69 标准输出: 99
解答
1 2 3 4 5 6 7 8 9 10 11
num = input() ans = []
for i in num: ans.append(i) for i inrange(len(ans)): if ans[i] == "6": ans[i] = "9" break
arr = input().split() for i inrange(len(arr)): arr[i] = int(arr[i])
i = 0 j = len(arr) - 1 ans = 0
while i < j: minH = min(arr[i], arr[j]) area = (j - i) * minH ans = max(ans, area) while arr[i] <= minH and i < j: i += 1 while arr[j] <= minH and i < j: j -= 1
print(ans)
Problem P23. [算法课回溯]括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
有效括号组合需满足:左括号必须以正确的顺序闭合。
1 <= n <= 8 请按照括号生成的层数有大到小排序,如输入3时,先生成((())),最后再生成 ()()()
defgen(left, right, temp): if left == 0and right == 0: ans.append(temp.copy()) return if left > 0: temp.append("(") gen(left - 1, right, temp) temp.pop(-1) if left < right: temp.append(")") gen(left, right - 1, temp) temp.pop(-1)
print("[", end="") gen(num, num, []) print("".join(ans[0]), end="") for i inrange(1, len(ans)): print(", ", end="") print("".join(ans[i]), end="") print("]", end="")
num = input().split() n = int(num[0]) k = int(num[1])
ans = []
defgen(cur, n, k, temp): if cur > n + 1: return iflen(temp) == k: for i inrange(len(temp)): temp[i] = str(temp[i]) ans.append(temp.copy()) return temp.append(cur) gen(cur + 1, n, k, temp) temp.pop(-1) gen(cur + 1, n, k, temp)
gen(1, n, k, []) print("[", end="") print("[", end="") print(", ".join(ans[0]), end="") print("]", end="") for i inrange(1, len(ans)): print(", ", end="") print("[", end="") print(", ".join(ans[i]), end="") print("]", end="") print("]", end="")
from collections import defaultdict num = int(input())
classSolution: defcountArrangement(self, n: int) -> int: match = defaultdict(list) for i inrange(1, n + 1): for j inrange(1, n + 1): if i % j == 0or j % i == 0: match[i].append(j) num = 0 vis = set()
defbacktrack(index: int) -> None: if index == n + 1: nonlocal num num += 1 return for x inmatch[index]: if x notin vis: vis.add(x) backtrack(index + 1) vis.discard(x)
backtrack(1) return num
s = Solution() print(s.countArrangement(num))
Problem P30. [算法课分支限界法]组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
输入
4 2
输出
1 2
1 3
1 4
2 3
2 4
3 4
样例
1 2 3 4
标准输入: 1 1 标准输出: 1
提示
1 <= n <= 20 1 <= k <= n
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
nums = input().split() n = int(nums[0]) k = int(nums[1]) res = [] defhelper(startindex,path): iflen(path) == k: res.append(path.copy()) return i = startindex while(i<=n-(k-len(path))+1): path.append(i) helper(i+1,path) path.pop() i += 1 helper(1,[]) for i in res: for j inrange(k): i[j] = str(i[j]) print(' '.join(i))
Problem P31. [算法课分支限界法]大礼包
在商店中, 有 n 件在售的物品。每件物品都有对应的价格。然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。
给你一个整数数组 price 表示物品价格,其中 price[i] 是第 i 件物品的价格。另有一个整数数组 needs 表示购物清单,其中 needs[i] 是需要购买第 i 件物品的数量。
还有一个数组 special 表示大礼包,special[i] 的长度为 n + 1 ,其中 special[i][j] 表示第 i 个大礼包中内含第 j 件物品的数量,且 special[i][n] (也就是数组中的最后一个整数)为第 i 个大礼包的价格。
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积。
提示:
2 <= n <= 58
题目数据保证运算过程不超过 int 所能表示的范围
输入
输入正整数n
输出
可以获得的最大乘积
样例
1 2 3 4 5 6 7 8 9
标准输入: 2 标准输出: 1
标准输入: 10 标准输出: 36
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import math
n = int(input()) if n <= 3: print(n-1) else: a = n // 3 b = n % 3 if b == 0: print(int(math.pow(3, a))) elif b == 1: print(int(math.pow(3, a - 1) * 4)) else: print(int(math.pow(3, a) * 2))
n = input().split() for i inrange(len(n)): n[i] = int(n[i]) iflen(n) == 0: print(0) else: N = len(n) dp = [0] * (N + 1) dp[0] = 0 dp[1] = n[0] for i inrange(2, N+1): dp[i] = max(dp[i-1], n[i-1] + dp[i-2]) print(dp[N])
Problem P37. 戳气球
有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。
现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i−1] × nums[i] × nums[i+1] 枚硬币。 这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1 或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。
求所能获得硬币的最大数量
提示:
n == nums.length
1 <= n <= 300
0 <= nums[i] <= 100
题目数据保证运算过程不超过 int 所能表示的范围
输入
输入一行数组num
输出
输出所能获得硬币的最大数量
样例
1 2 3 4 5 6 7 8 9
标准输入: 3 1 5 8 标准输出: 167
标准输入: 1 5 标准输出: 10
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
n = input().split() for i inrange(len(n)): n[i] = int(n[i]) n.insert(0, 1) n.insert(len(n), 1) store = [[0]*(len(n)) for i inrange(len(n))] for i inrange(2, len(n)): for j inrange(0, len(n) - i): m = 0 for k inrange(j+1, i+j): left = store[j][k] right = store[k][i+j] a = left + right + n[j] * n[i+j] * n[k] if a > m: m = a store[j][i+j] = m print(store[0][len(n)-1])
Problem P38. 分发糖果
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目。
提示:
n == ratings.length
1 ≤ n ≤ 2×10^4
0 ≤ ratings_i ≤ 2×10^4
输入
输入一行整数数组ratings
输出
输出需要准备的最少糖果数目
样例
1 2 3 4 5 6 7 8 9
标准输入: 1 0 2 标准输出: 5
标准输入: 1 2 2 标准输出: 4
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14
n = input().split() for i inrange(len(n)): n[i] = int(n[i]) iflen(n) == 0: print(0) else: candy = [1] * len(n) for i inrange(1, len(n)): if n[i] > n[i-1]: candy[i] = candy[i-1] + 1 for i inrange(len(n)-1, 0, -1): if n[i-1] > n[i]: candy[i-1] = max(candy[i-1], candy[i] + 1) print(sum(candy))
n = input().split() for i inrange(len(n)): n[i] = int(n[i]) a = n[0] b = n[1] c = n[2] if a + b < c: print('false') elif a == 0or b == 0: if c == 0or a + c == c: print('true') else: print('false') else: if c % math.gcd(a, b) == 0: print('true') else: print('false')
n = input().split() for i inrange(len(n)): n[i] = int(n[i]) down = 1 up = 1 for i inrange(1, len(n)): if n[i] > n[i-1]: up = down + 1 elif n[i] < n[i-1]: down = up + 1 iflen(n) == 0: print(0) else: print(max(up, down))
Problem P41. 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度
判断你是否能够到达最后一个下标。
提示:
1 ≤ nums.length ≤ 3×10_4
0 ≤ nums_i ≤ 10^5
输入
输入一行数组nums
输出
输出true/fasle
样例
1 2 3 4 5 6 7 8 9 10
标准输入: 2 3 1 1 4 标准输出: true
标准输入: 3 2 1 0 4 标准输出: false
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
n = input().split() for i inrange(len(n)): n[i] = int(n[i]) k = 0 reach = 0 rightmost = 0 for i inrange(len(n)): if i <= rightmost: rightmost = max(rightmost, i + n[i]) if rightmost >= len(n) - 1: reach = 1 if reach == 1: print('true') else: print('false')