P1: 差值数组不同的字符串
给你一个字符串数组 words ,每一个字符串长度都相同,令所有字符串的长度都为 n 。
每个字符串
w
o
r
d
s
[
i
]
words[i]
words[i] 可以被转化为一个长度为
n
−
1
n - 1
n−1 的 差值整数数组
d
i
f
f
e
r
e
n
c
e
[
i
]
difference[i]
difference[i],
其中对于
0
≤
j
≤
n
−
2
0 \le j\le n - 2
0≤j≤n−2 有
d
i
f
f
e
r
e
n
c
e
[
i
]
[
j
]
=
w
o
r
d
s
[
i
]
[
j
+
1
]
−
w
o
r
d
s
[
i
]
[
j
]
difference[i][j] = words[i][j+1] - words[i][j]
difference[i][j]=words[i][j+1]−words[i][j]。
注意:
两个字母的差值定义为它们在字母表中 位置 之差,也就是说 ‘a’ 的位置是 0 ,‘b’ 的位置是 1 ,‘z’ 的位置是 25 。
比方说,字符串 “acb” 的差值整数数组是 [2 - 0, 1 - 2] = [2, -1] 。
words 中所有字符串 除了一个字符串以外 ,其他字符串的差值整数数组都相同。你需要找到那个不同的字符串。
请你返回 words中 差值整数数组 不同的字符串。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/odd-string-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
- 送分题,按照题意翻译成代码就可以了。
P2. 距离字典两次编辑以内的单词
给你两个字符串数组 queries 和 dictionary 。数组中所有单词都只包含小写英文字母,且长度都相同。
一次 编辑 中,你可以从 queries 中选择一个单词,将任意一个字母修改成任何其他字母。从 queries 中找到所有满足以下条件的字符串:不超过 两次编辑内,字符串与 dictionary 中某个字符串相同。
请你返回 queries 中的单词列表,这些单词距离 dictionary 中的单词 编辑次数 不超过 两次 。单词返回的顺序需要与 queries 中原本顺序相同。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/words-within-two-edits-of-dictionary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解:
- 看数据范围三个维度都是100以内, 直接暴力解.
P3 摧毁一系列目标
给你一个下标从 0 开始的数组 nums ,它包含若干正整数,表示数轴上你需要摧毁的目标所在的位置。同时给你一个整数 space 。
你有一台机器可以摧毁目标。给机器 输入 nums[i] ,这台机器会摧毁所有位置在 nums[i] + c * space 的目标,其中 c 是任意非负整数。你想摧毁 nums 中 尽可能多 的目标。
请你返回在摧毁数目最多的前提下,nums[i] 的 最小值 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/destroy-sequential-targets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解:
- 数学题。 取模分组, 找出数量最多的组,可能多个组都有相同数量,这时候取最小值。
class Solution:
def destroyTargets(self, nums: List[int], space: int) -> int:
c = collections.Counter(list(map(lambda x: x % space, nums)))
m = max(c.values())
cs = [k for k, v in c.items() if v == m]
s = set(cs)
ret = 10 ** 9
for x in nums:
if (x % space) in s:
ret = min(ret, x)
return ret
P4 下一个更大元素 IV
给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数,你必须找到对应元素的 第二大 整数。
如果 nums[j] 满足以下条件,那么我们称它为 nums[i] 的 第二大 整数:
j > i
nums[j] > nums[i]
恰好存在 一个 k 满足 i < k < j 且 nums[k] > nums[i] 。
如果不存在 nums[j] ,那么第二大整数为 -1 。
比方说,数组 [1, 2, 4, 3] 中,1 的第二大整数是 4 ,2 的第二大整数是 3 ,3 和 4 的第二大整数是 -1 。
请你返回一个整数数组 answer ,其中 answer[i]是 nums[i] 的第二大整数
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/next-greater-element-iv
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解:
- 处理下一个最大的元素,可以用单调栈。 这题是要第二个大的。那就先用单调栈,然后弹出的时候,把元素放最小堆。
- 具体操作就是,遇到一个新元素,先检查堆顶元素,直到没有比新元素小的。然后进单调栈。
import bisect
class Solution:
def secondGreaterElement(self, nums: List[int]) -> List[int]:
n = len(nums)
stack = []
A = [-1 for _ in range(n)]
sa = []
for i, x in enumerate(nums):
while sa and x > sa[0][0]:
A[sa[0][1]] = i
del sa[0]
while stack and x > stack[-1][1]:
j, y = stack.pop()
bisect.insort(sa, (y, j))
stack.append((i, x))
return [nums[x]if x != -1 else -1 for x in A]