本文最后更新于 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 03676. 碗子数组的数目 - 力扣(LeetCode)
题目类型
#单调栈 #遍历
解题思路
基于单调栈特性,故栈顶元素和新入栈元素之间元素比小于两者,另栈弹出元素,即满足条件子数组长度至少为 3。
示例代码
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 ans3677. 统计二进制回文数字的数目 - 力扣(LeetCode)
题目类型
#位运算 #数位DP #双指针
解题思路
数位 DP,验证是否是回文数时,可以采用双指针进行判断优化。
示例代码
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] + anspython
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