力扣第 466 场周赛

本文最后更新于 3 分钟前,文中所描述的信息可能已发生改变。

3674. 数组元素相等的最小操作次数 - 力扣(LeetCode)

题目类型

#哈希 #脑筋急转弯

解题思路

参考:这道题很简单!

示例代码

python
class Solution:
    def minOperations(self, nums: List[int]) -> int:
        return 1 - int(len(set(nums)) == 1)

3675. 转换字符串的最小操作次数 - 力扣(LeetCode)

题目类型

#遍历

解题思路

参考:这道题很简单!

示例代码

python
class Solution:
    def minOperations(self, s: str) -> int:
        for i, c in enumerate(ascii_lowercase[1:], 1):
            if c in s:
                return 26 - i
        return 0

3676. 碗子数组的数目 - 力扣(LeetCode)

题目类型

#单调栈 #遍历

解题思路

基于单调栈特性,故栈顶元素和新入栈元素之间元素比小于两者,另栈弹出元素,即满足条件子数组长度至少为 3。

参考:单调栈,两种写法(Python/Java/C++/Go)

示例代码

python
class Solution:
    def bowlSubarrays(self, nums: List[int]) -> int:
        ans = 0
        st = []
        for x in nums:
            while st and st[-1] < x:
                st.pop()
                if st:
                    ans += 1
            st.append(x)
        return ans

3677. 统计二进制回文数字的数目 - 力扣(LeetCode)

题目类型

#位运算 #数位DP #双指针

解题思路

数位 DP,验证是否是回文数时,可以采用双指针进行判断优化。

参考:从 O(log n) 到 O(1)(Python/Java/C++/Go)

示例代码

python
f = [0] * 56
f[0] = 1
for i in range(54):
    f[i + 1] = f[i] + pow(2, i // 2 + 1) - pow(2, i // 2)
f[0] = 0


class Solution:
    def countBinaryPalindromes(self, n: int) -> int:
        nums = list(map(int, bin(n)[2:]))
        m = len(nums)
        half = (m + 1) // 2

        @lru_cache(None)
        def dfs(i: int, is_limit: bool) -> int:
            if i == half:
                if is_limit:
                    j = i
                    while j < m:
                        x = nums[m - j - 1]
                        if x != nums[j]:
                            return 1 - x
                        j += 1
                return 1
            res = 0
            lo = 0 if i or m == 1 else 1
            hi = nums[i] if is_limit else 1
            for d in range(lo, hi + 1):
                res += dfs(i + 1, is_limit and d == hi)
            return res

        ans = dfs(0, True)
        dfs.cache_clear()
        return f[n.bit_length() - 1] + ans
python
class Solution:
    def countBinaryPalindromes(self, n: int) -> int:
        if n == 0:
            return 1
        m = n.bit_length()
        k = (m - 1) // 2

        ans = (2 << k) - 1
        if m % 2 == 0:
            ans += 1 << k

        pal = n >> (m // 2)
        ans += pal - (1 << k)

        v = pal >> (m % 2)
        while v:
            pal = pal * 2 + v % 2
            v //= 2
        if pal <= n:
            ans += 1
        return ans
力扣第 467 场周赛
力扣第 164 场双周赛