33/leetcode

/315. 计算右侧小于当前元素的个数/315. 计算右侧小于当前元素的个数.py
"""
给定一个非空整数数组,找到一个下标(从0到n-1)满足:你的任意两个相邻元素间距之差都不大于1。

如果我们从这个数组中选出任意两个相邻元素,那么它们的差值必须小于等于1。

如果不存在这样的下标,返回 -1。否则,返回一个满足上述条件的最小下标。
"""
class Solution(object):
def findUnsortedSubarray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
left = 0
right = len(nums) - 1
min_left = float('inf')
max_right = float('-inf')
while left <= right:
if nums[left] <= min_left:
min_left = nums[left]
else:
right = left
if nums[right] >= max_right:
max_right = nums[right]
else:
left = right
return right - left + 1 if right - left > 0 else -1

/313. 跳跃游戏II/313. 跳跃游戏II.py
"""
给定一个整数数组 nums 和一个正整数 k,找出该数组内所有次数不小于 k 的元素,并按升序排序后返回。

你可以认为数组里至少存在一个次数大于等于 k 的元素。
"""
from collections import Counter
class Solution(object):
def countSort(self, nums):
# 1. 先计数排序
cnt = Counter(nums)
# 2. 创建一个空列表
res = []
for num, cnt in cnt.items():
# 3. 如果元素出现的次数大于等于 k,则将其添加到列表中
if cnt >= k:
res.append(num)
# 4. 返回结果列表
return sorted(res)

def minMaxQueue(self, nums):
# 1. 创建两个队列,一个用于存储最大值,一个用于存储最小值
max_q = []
min_q = []
# 2. 遍历整个列表
for num in nums:
# 3. 将当前元素添加到最大值队列中
max_q.append(-num)
# 4. 将当前元素添加到最小值队列中
min_q.append(num)
# 5. 确保最大值队列中的元素总是比最小值队列中的元素大
if len(max_q) > 1 and max_q[-1] < -min_q[-1]:
max_q.pop()
min_q.pop()
# 6. 如果最大值队列的长度大于1,则将最大值队列中的元素转换为正数
if len(max_q) > 1:
max_q.pop()
# 7. 如果最小值队列的长度大于1,则将最小值队列中的元素转换为正数
if len(min_q) > 1:
min_q.pop()
# 8. 如果最大值队列和最小值队列都为空,则说明当前元素可以被添加到结果列表中
if len(max_q) == 0 and len(min_q) == 0:
res.append(-max_q[0])
res.append(min_q[0])
return res

def findKthLargest(self, nums, k):
# 1. 创建一个最小堆
min_heap = []
# 2. 遍历整个列表
for num in nums:
# 3. 将当前元素添加到最小堆中
heapq.heappush(min_heap, num)
# 4. 如果最小堆的长度大于 k,则将堆顶元素弹出
if len(min_heap) > k:
heapq.heappop(min_heap)
# 5. 返回最小堆的堆顶元素
return -min_heap[0]

def findKthSmallest(self, nums, k):
# 1. 创建一个最大堆
max_heap = []
# 2. 遍历整个列表
for num in nums:
# 3. 将当前元素添加到最大堆中
heapq.heappush(max_heap, -num)
# 4. 如果最大堆的长度大于 k,则将堆顶元素弹出
if len(max_heap) > k:
heapq.heappop(max_heap)
# 5. 返回最大堆的堆顶元素
return -max_heap[0]

def minHeapTopK(self, nums, k):
# 1. 创建一个最大堆
max_heap = []
# 2. 遍历整个列表
for num in nums:
# 3. 将当前元素添加到最大堆中
heapq.heappush(max_heap, -num)
# 4. 如果最大堆的长度大于 k,则将堆顶元素弹出
if len(max_heap) > k:
heapq.heappop(max_heap)
# 5. 返回最大堆的堆顶元素
return -max_heap[0]

def maxHeapTopK(self, nums, k):
# 1. 创建一个最小堆
min_heap = []
# 2. 遍历整个列表
for num in nums:
# 3. 将当前元素添加到最小堆中
heapq.he