LeetCode笔记:Weekly Contest 321
Posted Espresso Macchiato
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode笔记:Weekly Contest 321相关的知识,希望对你有一定的参考价值。
1. 题目一
给出题目一的试题链接如下:
1. 解题思路
这一题思路其实也简单,显然在分割当中,只有pivot前后段都用到了,因此,只需要前面到pivot的累加求和的两倍刚好是总的累加求和加上pivot,那么这个值就是目标的pivot。
2. 代码实现
给出python代码实现如下:
class Solution:
def pivotInteger(self, n: int) -> int:
s = n * (n+1) // 2
t = 0
for i in range(1, n+1):
t += i
if t * 2 == s + i:
return i
return -1
提交代码评测得到:耗时86ms,占用内存13.9MB。
2. 题目二
给出题目二的试题链接如下:
1. 解题思路
这一题就是贪婪法一个个去匹配t中的字符,直到遍历完s。
剩下的没有被匹配到的子串就是最后需要append到s末尾的子串。
2. 代码实现
给出python代码实现如下:
class Solution:
def appendCharacters(self, s: str, t: str) -> int:
i, n = 0, len(t)
for ch in s:
if i >= n:
break
if ch == t[i]:
i += 1
return n - i
提交代码评测得到:耗时99ms,占用内存15.1MB。
3. 题目三
给出题目三的试题链接如下:
1. 解题思路
这一题我其实取巧了,我用了一个额外地数组来规避了链表复杂的删除操作。
但是这一题的思路本身确实很简单的,就是一个类有序数列的思路就是了,就不怎么多做展开了。
2. 代码实现
给出python代码实现如下:
class Solution:
def removeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]:
s = []
while head:
while s != [] and s[-1] < head.val:
s.pop()
s.append(head.val)
head = head.next
ret = ListNode(s[0])
p = ret
for v in s[1:]:
node = ListNode(v)
p.next = node
p = node
return ret
提交代码评测得到:耗时3748ms,占用内存76.8MB。
4. 题目四
给出题目四的试题链接如下:
1. 解题思路
这一题思路上其实也还好,虽然是一道hard的题目,就是先找到目标值k,然后要使得这个数为中位数,那么就要求:
- 这个子序列包含k;
- 这个子序列当中大于k的元素与小于k的元素数目最多差1,取决于这个数组长度是奇数还是偶数。
因此,我们只需要找到k的位置,然后分别往前后考察大于k与小于k的元素个数之差,要使得k恰好为中位数,那么这两者必为相反数或者相差一。
由此,我们就能够获得我们的最终答案。
2. 代码实现
给出python代码实现如下:
class Solution:
def countSubarrays(self, nums: List[int], k: int) -> int:
n = len(nums)
idx = nums.index(k)
if idx == -1:
return 0
left = defaultdict(list)
right = defaultdict(list)
d = 0
left[d].append(idx)
for i in range(idx-1, -1, -1):
if nums[i] > k:
d -= 1
else:
d += 1
left[d].append(i)
d = 0
right[d].append(idx)
for i in range(idx+1, n):
if nums[i] > k:
d += 1
else:
d -= 1
right[d].append(i)
res = 0
for d in left:
res += len(left[d]) * len(right[d])
lodd = len([x for x in left[d] if x % 2 == 1])
leven = len(left[d]) - lodd
rodd = len([x for x in right[d+1] if x % 2 == 1])
reven = len(right[d+1]) - rodd
res += lodd * reven + leven * rodd
return res
提交代码评测得到:耗时1462ms,占用内存30.8MB。
以上是关于LeetCode笔记:Weekly Contest 321的主要内容,如果未能解决你的问题,请参考以下文章