ARTS 第 22 周

每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章


Contents:


Algorithm

53. Maximum Subarray

题目:53. Maximum Subarray

难度:Easy

题意:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

解法:

本题可用暴力法来解决,基本思路就是计算出所有子序列的和,然后找出最大的和即可。但一般情况下,暴力法并不是最好的解决方法。

由于最大子序和这个问题是一道很经典的算法题(参考维基百科),它于 1997 年被布朗大学的 Ulf Grenander 教授提出,然而一直到 1984 年卡内基梅隆大学的 Jay Kedane 才发现了线性时间的最优解法,虽然算法看起来很短,但是并不容易理解。下面介绍 Kedane 算法。

Kedane 算法的基本思路就是把整个的数组遍历一遍,使用两个变量,max_ending_here 记录遍历的时候,如果当前元素是子序列的最后一个元素,所能找到的最大子序列的和,由于真正的最大子序列必然存在一个结尾元素,所以只需要从每个位置计算出的 max_ending_here 中,找到最大值,就是全局的最大子序列的值,max_so_far 记录遍历的时候找到的最大的 max_ending_here,当遍历完成之后,即是我们要找的整个序列的最大子序和。

代码:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_ending_here = max_so_far = nums[0]

        for num in nums[1:]:
            max_ending_here = max(num, max_ending_here + num)
            max_so_far = max(max_so_far, max_ending_here)

        return max_so_far

时间复杂度 O(n),空间复杂度 O(1)。


Review

Complete Guide to Parameter Tuning in XGBoost with codes in Python

本周继续阅读有关 XGBoost 的文章,Complete Guide to Parameter Tuning in XGBoost with codes in Python

本文分为三个部分。

第一部分讲述了 XGBoost 的几个优点:

第二部分讲述了使用 XGBoost 时的参数。第三部分用完整的例子讲述了对 XGBoost 进行调参的过程。

第二三部分由于叙述过于详细,在此就不予阐述,感兴趣的同学可以去阅读原文。


Tips

一个 LeetCode 题解项目

这周和大家分享一个 GitHub 上的 LeetCode 题解项目,https://github.com/azl397985856/leetcode


Share

Vim 中的多文件操作——Buffer、Window、Tab

本周和大家分享一下 vim 中如何比较方便地去同时查看编辑多个文件。

Buffer

首先和大家介绍一下 vim 中的一个概念叫 buffer,可能学计算机相关的同学们会比较熟悉,没错,它就是计算机内存中的「缓冲区」。我们每次打开一个文件,vim 都会在内存中申请一块缓冲区来存放我们这个文件,只有我们使用 :w 保存的时候才会将缓冲区中修改的内容写入到文件中去。

使用 :ls 命令来查看当前我们打开了多少个文件,即缓冲区中的文件数量。使用 :b n 跳转到第 n 个缓冲区,也可以使用 :bpre:bnext:bfirst:blast 来跳转,还可以使用 :b [buffer_name] 来跳转到指定名称的缓冲区。

Window

第二个要介绍的概念就是 window,理解起来很简单就是「窗口」。一个 buffer 可以分割成多个 window,一个 window 也可以打开几个不同的 buffer。

使用 :sp<C-w>s来水平分割,:vs<C-w>v来垂直分割。这个过程你试一下就知道了,非常的简单。

那么如何在几个窗口之间跳转呢?

使用 <C-w> 作为 leader 键,同时加上 hjkl 四个键就可以实现光标在不同窗口之间跳转,使用 <C-w>w 在窗口之间循环切换。

Tab

最后一个概念叫做 tap,就是标签页,用来分组窗口的。你可以把它类比作 Linux 中的「工作区」,每个标签页中都只打开同一个类型的文件,比如第一个标签页只打开 Java 文件,第二个标签页只打开 Python 文件,第三个标签页只打开 HTML 文件。

使用 :tabe[dit] {filename} 来来一个新标签页中打开一个文件,:tabc[lose] 来关闭当前标签页,这个标签页中的所有窗口也都会被关闭,:tabo[nly] 来关闭出当前标签页外的所有标签页。

使用 gtgT 来切换到下一个或上一个标签页。

总结

是不是感觉 vim 有太多命令?可能这也是 vim 把很多人劝退的原因,但是我们有强大的「二八定律」(笑),只要掌握了几个常用的命令,我们就能完成大部分的工作。最后当然要一直强迫自己去使用 vim 来达到一个手熟的程度。

Bon courage !