ARTS 20201218-1231

Algorithm: 每周至少做一个 LeetCode 的算法题
剑指 Offer 12. 矩阵中的路径

两个关键: 1起始位置 2行动方向
一般都使用深度优先或者广度优先算法遍历(递归法)
回溯法三个步骤

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

LeetCode 378 有序矩阵中第 K 大的数
解法1: 使用堆排序

int kthSmallest(vector>& matrix, int k) {
        priority_queue q;
        for (int i = 0; i < matrix.size(); ++i) {
            for (int j = 0; j < matrix[i].size(); ++j) {
                q.emplace(matrix[i][j]);
                if (q.size() > k) q.pop();
            }
        }
        return q.top();
}

解法2: 使用二分法 -> 对值进行二分搜索, 不是索引二分搜索
二分查找法有两种: 基于索引和基于数值的()
1 基于索引即根据数组中元素下标
2 基于数值即根据数组的首尾元素找到中间值, 确定大于等于或小于等于中间值的数组元素.

拓展1: 240. 搜索二维矩阵 II
拓展2: 使用BFPRT 法实现 O(n)查找第k 小的数
1 找数组中第 k 小的数: 1 快排, 2 数组中的 nums[k-1], 时间复杂度: O(nlgn)
2 BFPRT 算法每次选择五分中位数作为 pivot, 为了是划分合理, 避免最坏情况发生.
算法步骤:
(1)将输入数组的n个元素划分为n/5组,每组5个元素,且至多只有一个组由剩下的n%5个元素组成。
(2)寻找n/5个组中每一个组的中位数,首先对每组的元素进行插入排序,然后从排序过的序列中选出中位数。
(3)对于(2)中找出的n/5个中位数,递归进行步骤(1)和(2),直到只剩下一个数即为这n/5个元素的中位数,找到中位数后并找到对应的下标p。
(4)进行Partion划分过程,Partion划分中的pivot元素下标为p。
(5)进行高低区判断即可。
本算法的最坏时间复杂度为O(n),值得注意的是通过BFPTR算法将数组按第K小(大)的元素划分为两部分,而这高低两部分不一定是有序的,通常我们也不需要求出顺序,而只需要求出前K大的或者前K小的。

Review: 阅读并点评至少一篇英文技术文章
(1)Developing Web Applications with Flask
(2)Building a Flask Web Application (Flask Part 2)
(3)9 Ways to Boost Your Swift Code Performance

Tips: 学习至少一个技术技巧
Flask 实现的 web app 中的 MVC 模式.

Share: 分享一篇有观点和思考的技术文章
百度 iOS 客户端 Objective-C Swift 组件化混编之路(1)

你可能感兴趣的:(ARTS 20201218-1231)