我在这篇文章中选取了我在豆包MarsCode AI刷题中做过的几道中等题进行解析:数组元素之和最小化、最少前缀操作问题、最大矩形面积问题。这几道题整体都比较简单。
数组元素之和最小化
问题描述
小C希望构造一个包含n个元素的数组,且满足以下条件:
- 1.数组中的所有元素两两不同
- 2.数组所有元素的最大公约数为
k。 - 3.数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
思路解析
比较简单,找n个k的倍数相加就可以了。
代码实现
def solution(n: int, k: int) -> int:
sum = 0
for i in range(1, n+1):
sum += i*k
return sum
最少前缀操作问题
问题描述
小U和小R有两个字符串,分别是和,现在小U需要通过对进行若干次操作,使其变成的一个前缀。操作可以是修改的某一个字符,或者删除末尾的字符。现在你需要帮助小U计算出,最少需要多少次操作才能让变成的前缀。
测试样例
样例1:
输入:S ="aba",T="abb" 输出:1
样例2:
输入:S="abcd",T="efg" 输出:4
样例3:
输入:S ="xyz",T="xy" 输出:1
样例4:
输入:S="hello",T="helloworld" 输出:0
样例5:
输入:S="same",T="same" 输出:0
思路解析
首先求出S和T中最短的长度,遍历该长度,若某个位置S和T不相同,则操作次数增加一次。遍历完后,按照S和T的长度不同,分情况讨论:
当S长度大于T,S需要删去多余的字符,操作数相应增加;其余情况直接返回即可。
代码实现
def solution(S: str, T: str) -> int:
sum = 0
min_len = min(len(S), len(T))
for i in range(min_len):
if S[i] != T[i]:
sum += 1
if len(S) > len(T):
sum += len(S[min_len:])
return sum
最大矩形面积问题
问题描述
小S最近在分析一个数组 ,数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意 个相邻元素时,如何计算它们所能形成的最大矩形面积。
对于 个相邻的元素,我们定义其矩形的最大面积为:
即, 的值为这 个相邻元素中的最小值乘以 。现在,小S希望你能帮他找出对于任意 , 的最大值。
测试样例
样例1:
输入:n=5,array=[1,2,3,4,5]输出:9
样例2:
输入:n=6,array =[5,4,3,2,1,6]输出:9
样例3:
输入:n=4,array=[4,4,4,4]输出:16
思路解析
一道双指针题, max_area用于记录最大矩形面积,min_height 用于记录当前的最小高度。
第一个循环遍历所有可能的k的取值;
第二个循环遍历从数组内每个数开始寻找的所有情况,每遍历完一次,使用该次找到的最小高度更新最大面积;
第三个循环在每次查看k个数时,遍历比较数的大小,更新找到的最小高度。
代码实现
def solution(n, array):
max_area = 0
for k in range(1, n+1):
for i in range(n-k+1):
min_height = float('inf')
for j in range(i, i+k):
min_height = min(min_height, array[j])
max_area = max(max_area, min_height * k)
return max_area