数组元素之和最小化、 最少前缀操作问题、最大矩形面积问题| 豆包MarsCode AI刷题

124 阅读3分钟

我在这篇文章中选取了我在豆包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有两个字符串,分别是SSTT,现在小U需要通过对SS进行若干次操作,使其变成TT的一个前缀。操作可以是修改SS的某一个字符,或者删除SS末尾的字符。现在你需要帮助小U计算出,最少需要多少次操作才能让SS变成TT的前缀。

测试样例

样例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最近在分析一个数组 h1,h2,hNh 1,h2,… hN,数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意 kk 个相邻元素时,如何计算它们所能形成的最大矩形面积。

对于 kk 个相邻的元素,我们定义其矩形的最大面积为:

R(k)=k×min(h[i],h[i+1],.h[i+k1])R(k)= k \times min(h[i], h[i + 1],. h[i + k-1])

即,R(k)R(k) 的值为这 kk 个相邻元素中的最小值乘以 kk。现在,小S希望你能帮他找出对于任意 kkR(k)R(k) 的最大值。

测试样例

样例1: 输入:n=5array=[1,2,3,4,5]输出:9

样例2: 输入:n=6array =[5,4,3,2,1,6]输出:9

样例3: 输入:n=4array=[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