ARTS 第 10 周

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


Contents:


Algorithm

求众数 II 题目:229. Majority Element II

难度:Medium

题意:给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

示例一:

Input: [3,2,3]
Output: [3]

示例二:

Input: [1,1,1,3,3,2,2,2]
Output: [1,2]

提示:How many majority elements could it possibly have?

解法:这道题是上周求众数那一题的升级版,将出现次数由 n/2 变为了 n/3,并且限定了时空间复杂度,那么只能使用摩尔投票法了。题目里给了一个很重要的提示:最多可能有多少个「出现超过 ⌊ n/3 ⌋ 次」的元素?那么可以考虑到:如果有超过 2 个,也就是至少 3 个数字满足「出现的次数大于 n/3」,那么就意味着数组里总共有超过 3*(n/3) = n 个数字,这与已知的数组大小矛盾,所以,只可能有两个或者更少的「众数」。有了这层思考之后,我们就可以效仿上周的摩尔投票法,使用两个计数器 count1 与 count2 以及两个数字 candidate1 与 candidate2,其他思路与之前一致。另外,这题需要验证「众数」是否存在,那么就多了一个计数的过程。

代码:

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """

        candidate1, candidate2, count1, count2 = None, None, 0, 0
        for num in nums:
            if num == candidate1:
                count1 += 1
            elif num == candidate2:
                count2 += 1
            elif count1 == 0:
                candidate1, count1 = num,1
            elif count2 == 0:
                candidate2, count2 = num,1
            else:
                count1 -= 1
                count2 -= 1

        count1, count2 = 0,0
        for num in nums:
            if num == candidate1:
                count1 += 1
            if num == candidate2:
                count2 += 1
        candidates = []
        if count1 > len(nums)//3:
            candidates.append(candidate1)
        if count2 > len(nums)//3:
            candidates.append(candidate2)
        return candidates

Review

What is AWS? A Guide for Beginners.

这周阅读了一篇系统而简洁地介绍 AWS 的文章。AWS(Amazon Wes Services)是亚马逊的云服务,这篇文章对 AWS 的各项服务做了简洁明了的介绍,以及对「在何时应选何种服务」提供了很好的建议。包括:


Tips

分享一个百度网盘加速器

链接:https://www.baiduwp.com/


Share

Anaconda 简洁教程

在数据科学中,我们经常需要切换不同的 Python 虚拟环境以及安装经常使用的程序包,以便更轻松地处理多个项目。这个时候,我们就需要一个可以对虚拟环境和程序包进行高效管理的工具了,Anaconda 即是其中的一个很好的选择。

Anaconda 是什么?

Anaconda 其实是一个软件发行版(Distribution),它包含了包和环境管理器 condaPython 以及非常多常用的工具包和依赖项(尤其是数据科学),所以使用 Anaconda 可以让你立即上手处理数据。如果你想要节省空间,也可以使用不包含那些工具包和依赖项的 miniconda

管理包

包管理器是在计算机上安装库和依赖项的工具。如果你有使用 Python 的经验的话,那你对 pip 一定不陌生,它是 Python 默认的包管理器。而 conda 和 pip 非常相似,但是 conda 以数据科学的包为主,pip 更适合一般的用途。此外 conda 也支持为其他的语言提供包管理的功能,你可以通过它安装非 Python 的包。使用 conda 的同时你也可以使用 pip 来管理 Python 库。

使用 conda 安装 numpy

环境

除了可以管理包,conda 还提供环境管理的功能。另外两个很流行的环境管理工具是 virtualenvpyenv

环境能让你分隔用于不同项目的 Python 版本和包。比如你有两个项目需要使用不同版本的 numpy,因为你需要使用 numpy 最新版本的新功能,或者旧版本中的一些新版本已经不再支持的功能,最明智的做法是为这两个项目分别创建两个不同的 Python 环境,然后分别在这两个环境下工作。对于 Python 2 和 Python 3 也是如此。你可以很方便地将环境中的包列表导出为一个文件,并与你的代码保存在一起:pip freeze > requirements.txt

如何安装 Anaconda

Anaconda 是全平台通用软件。https://www.anaconda.com/distribution 上可以找到安装程序和说明。 安装了 Anaconda 之后,你的所有 Python 脚本以及程序会默认使用 Anaconda 附带的 Python,所以即是你的电脑上之前已经安装过 Python,也不会有任何影响。 选择 Python 3.7 版本(你也可以根据具体的需要选择 Python 2 的版本)。如果是 64 位操作系统,则选择 64 位安装程序,否则选择 32 位安装程序。完成安装后,会自动进入默认的 conda 环境,而且所有包均已安装完毕,如下面所示。可以在终端或命令提示符中键入 conda list,以查看你安装的内容。

管理包

你可以很方便的使用 conda 安装和管理包:

管理环境

使用 conda 的目的之一便是管理环境以实现 Python 项目的互相隔离。以下是使用 conda 管理环境的常用命令:

更多

要详细了解 conda,请查看这篇文章:Conda myths and misconceptions,此外,conda 的官方文档也是很好的材料。