基础课第一章—基础算法

https://www.acwing.com/blog/content/277/

排序

快排、归并排序

  1. 模板背会。
  2. 模板题目默写一遍。
  3. 提高熟练度。同一个模板题重复3-5次?

快排——分治

  1. 确定分界点x:取左边界 q[l], 中间值 q[(l+r)/ 2], q[r], 随机
  2. 调整区间。使第一个区间的数都小于等于x。第二个区间都大于等于x。(难点)
  3. 递归处理左右两段

调整区间方法(最简单):

  1. 开两个新数组a、b。
    1. 扫描数组所有数。如果小于等于x则插入a
    2. 否则插入b
  2. 在把a、b放回原来数组

这样需要额外空间。

优美的方法:

  1. 两个指针i,j,指向两端。
    1. a[i]只要小于等于x就继续往右走
    2. a[j]只要大于等于x就继续向左走
  2. 如果此时 i<j, 就交换a[i], a[j]

归并排序——分治

  1. 确定分界点:mid=(l + r) / 2
  2. 递归排序left、right
  3. 归并left、right。合二为一(难点) 双指针算法

二分

整数二分

边界比较多。容易死循环。有单调性肯定可以二分。没有单调性也可以二分。本质:一半区间满足某个性质。另一半区间不满足性质。可以找到两个区间的分界点。

  1. 二分红色中间点
    1. mid=(l+r + 1) / 2; (注意这里加了 1 )
    2. if(check(mid))
      1. 成立:mid在红色区间,则红色分界点在[mid, r]里面。是包含mid的。l=mid
      2. 不成立:mid在绿色区间。红色分界点一定在[l, mid - 1]。是不包含mid的。r=mid-1
  2. 二分绿色分界点
    1. mid=(l+r) / 2(注意这里没有加1)
    2. if(check(mid))
      1. true, mid在绿色区间内。绿色边界点在[l, mid]上。r = mid。
      2. false,mid在红色区间内。绿色分界点在[mid + 1, r]内,l=mid+1。
  3. 如何确定怎么二分?
    1. 先写check。看怎么更新区间。如果是l=mid,要补上+1。如果是r=mid。则不用加一
  4. 加1是因为除法是下取整的。偏向 l 一侧。所以l=mid如果不加一。区间就缩小不了。就死循环了。
发布了44 篇原创文章 · 获赞 0 · 访问量 955

猜你喜欢

转载自blog.csdn.net/weixin_37748689/article/details/102771343