返回

秀翻全球程序员!LeetCode周赛#47上分攻略

闲谈

LeetCode周赛#47:算法技巧大比拼

前言:
各位算法精英们,欢迎来到LeetCode周赛#47的精彩回顾!本次比赛涵盖了贪心、枚举、前后缀分解、单调栈等算法技巧,每一题都烧脑十足。下面,让我们逐一拆解这三道难题,领略算法之美。

第一题:最大二进制奇数

题目:
给定一个正整数n,将其转换成二进制奇数。每次操作,你可以将n的某个二进制位从0变成1,或者从1变成0。求出将n转换成二进制奇数所需的最小操作次数。

解法:
贪心算法。从高位到低位遍历n的二进制位,遇到0则将其变为1,遇到1则将其变为0。这样,我们可以保证得到的二进制奇数与n的差值最小。

代码示例:

def max_binary_odd(n):
    binary_n = bin(n)[2:]
    count = 0
    for i in range(len(binary_n) - 1, -1, -1):
        if binary_n[i] == '0':
            count += 1
        else:
            count += 1
    return count

第二题:美丽塔I

题目:
给定一个数组stones,其中stones[i]表示第i块石头的重量。用这些石头搭建一座递增的塔,即每一块石头的重量都必须大于或等于前一块石头的重量。求出能搭建的最高塔的高度。

解法:
枚举加单调栈。枚举每一块石头作为塔底,用单调栈维护一个递增序列。当遇到比单调栈顶端小的石头时,将其压入栈中;遇到比单调栈顶端大的石头时,则弹出栈顶元素,继续比较。最后,栈中剩余的石头就是能搭建的最高塔。

代码示例:

def tallest_tower_i(stones):
    stack = []
    for stone in stones:
        while stack and stack[-1] >= stone:
            stack.pop()
        stack.append(stone)
    return len(stack)

第三题:美丽塔II

题目:
与第二题类似,但允许使用任意数量的石头(可以重复使用)。求出能搭建的最高塔的高度。

解法:
枚举加单调栈加计数。与第二题相同,但使用一个计数器记录每块石头的使用次数。当遇到比单调栈顶端小的石头时,将其压入栈中,并增加计数器;遇到比单调栈顶端大的石头时,则弹出栈顶元素,并减少计数器。最后,栈中剩余的石头就是能搭建的最高塔。

代码示例:

def tallest_tower_ii(stones):
    stack = []
    count = {}
    for stone in stones:
        while stack and stack[-1] >= stone:
            stack.pop()
            count[stack[-1]] -= 1
            if count[stack[-1]] == 0:
                del count[stack[-1]]
        stack.append(stone)
        if stone not in count:
            count[stone] = 0
        count[stone] += 1
    return len(stack)

总结:
通过LeetCode周赛#47的三道题目,我们再次领悟了算法技巧在解决实际问题中的重要性。贪心、枚举、单调栈等算法,让我们能够高效地解决各种复杂问题。各位算法精英们,继续保持热情,不断精进,下周再见!

常见问题解答:

  1. Q:这些算法技巧是否适用于其他编程语言?
    A:是的,这些算法技巧是算法通用的,可以应用于各种编程语言。

  2. Q:如何提高我在LeetCode上的表现?
    A:勤加练习、总结规律、学习他人的解法,并不断挑战自己。

  3. Q:在实际项目中,如何运用这些算法技巧?
    A:算法技巧是解决实际问题的基石,例如在数据处理、网络优化和机器学习中都有广泛应用。

  4. Q:如何培养算法思维?
    A:通过解决算法问题,不断锻炼逻辑思维、抽象能力和解决问题的能力。

  5. Q:LeetCode周赛有什么好处?
    A:LeetCode周赛不仅可以检验算法技能,还可以拓展知识面、结交同好,为职业发展奠定基础。