数据结构与算法:排序+二分查找
【排序】
- 实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序(选做)(完成leetcode上的返回滑动窗口中的最大值(239),这是上一期第三天的任务进行保留(涉及队列可以对第二天进行整理复习))
- 编程实现 O(n) 时间复杂度内找到一组数据的第 K 大元素
练习:
滑动窗口最大值 https://leetcode-cn.com/problems/sliding-window-maximum/
思路:1暴力法 2双端队列
class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: ''' #暴力法 if nums==[]: return [] n=len(nums) res=[] for i in range(n-k+1): window=nums[i:i+k] res.append(max(window)) return res if not nums or k == 0: return [] if k == 1: return nums ''' #双端队列 if nums == [] or k == 0: return [] if k == 1: return nums #队列里保存可能是最大值的索引 queue = [0] # 存放窗口中最大值 res = [] for i in range(1,len(nums)): #判断队首对应的元素是否已经滑出窗口 if i-queue[0] >= k: queue.pop(0) #保证当前最大值的索引是第一个。遇到一个新数时,将它与队尾元素比较,如果大于队尾元素,则丢掉队尾元素,继续重复比较,直到新数小于队尾元素,或者队列为空为止,将新数下标放入队列 while queue and nums[queue[-1]] < nums[i]: queue.pop() queue.append(i) if i >= k-1: res.append(nums[queue[0]]) return res
【二分查找】
- 实现一个有序数组的二分查找算法
- 实现模糊二分查找算法(比如大于等于给定值的第一个元素)
练习:
x 的平方根 https://leetcode-cn.com/problems/sqrtx/
思路:二分法
class Solution: def mySqrt(self, x: int) -> int: low=0 high=x while low<=high: mid=(low+high)//2 if mid**2==x: return mid elif mid**2<x: low=mid+1 else: high=mid-1 return high