数据结构与算法:排序+二分查找

【排序】

  1. 实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序(选做)(完成leetcode上的返回滑动窗口中的最大值(239),这是上一期第三天的任务进行保留(涉及队列可以对第二天进行整理复习))
  2. 编程实现 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

 

【二分查找】

  1. 实现一个有序数组的二分查找算法
  2. 实现模糊二分查找算法(比如大于等于给定值的第一个元素)

  练习:

  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

 

posted @ 2019-05-18 09:51  DeepLearning_Man  阅读(299)  评论(0编辑  收藏  举报