每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章
求众数 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
What is AWS? A Guide for Beginners.
这周阅读了一篇系统而简洁地介绍 AWS 的文章。AWS(Amazon Wes Services)是亚马逊的云服务,这篇文章对 AWS 的各项服务做了简洁明了的介绍,以及对「在何时应选何种服务」提供了很好的建议。包括:
分享一个百度网盘加速器
Anaconda 简洁教程
在数据科学中,我们经常需要切换不同的 Python 虚拟环境以及安装经常使用的程序包,以便更轻松地处理多个项目。这个时候,我们就需要一个可以对虚拟环境和程序包进行高效管理的工具了,Anaconda 即是其中的一个很好的选择。
Anaconda 其实是一个软件发行版(Distribution),它包含了包和环境管理器 conda、Python 以及非常多常用的工具包和依赖项(尤其是数据科学),所以使用 Anaconda 可以让你立即上手处理数据。如果你想要节省空间,也可以使用不包含那些工具包和依赖项的 miniconda。
包管理器是在计算机上安装库和依赖项的工具。如果你有使用 Python 的经验的话,那你对 pip 一定不陌生,它是 Python 默认的包管理器。而 conda 和 pip 非常相似,但是 conda 以数据科学的包为主,pip 更适合一般的用途。此外 conda 也支持为其他的语言提供包管理的功能,你可以通过它安装非 Python 的包。使用 conda 的同时你也可以使用 pip 来管理 Python 库。
除了可以管理包,conda 还提供环境管理的功能。另外两个很流行的环境管理工具是 virtualenv 和 pyenv。
环境能让你分隔用于不同项目的 Python 版本和包。比如你有两个项目需要使用不同版本的 numpy,因为你需要使用 numpy 最新版本的新功能,或者旧版本中的一些新版本已经不再支持的功能,最明智的做法是为这两个项目分别创建两个不同的 Python 环境,然后分别在这两个环境下工作。对于 Python 2 和 Python 3 也是如此。你可以很方便地将环境中的包列表导出为一个文件,并与你的代码保存在一起:pip freeze > requirements.txt
。
Anaconda 是全平台通用软件。https://www.anaconda.com/distribution 上可以找到安装程序和说明。 安装了 Anaconda 之后,你的所有 Python 脚本以及程序会默认使用 Anaconda 附带的 Python,所以即是你的电脑上之前已经安装过 Python,也不会有任何影响。 选择 Python 3.7 版本(你也可以根据具体的需要选择 Python 2 的版本)。如果是 64 位操作系统,则选择 64 位安装程序,否则选择 32 位安装程序。完成安装后,会自动进入默认的 conda 环境,而且所有包均已安装完毕,如下面所示。可以在终端或命令提示符中键入 conda list
,以查看你安装的内容。
你可以很方便的使用 conda 安装和管理包:
conda install <package_name>
conda install <package_name>=<version_number>
conda install <package_name1> <package_name2> <package_name3>
conda remove <package_name>
conda update <package_name>
conda update --all
conda list
conda search <package_name>
conda -h(--help)
来查看帮助使用 conda 的目的之一便是管理环境以实现 Python 项目的互相隔离。以下是使用 conda 管理环境的常用命令:
conda create -n <env_name> python=<version_of_python> <list_of_packages>
。其中,<env_name>
是环境的名字,<version_of_python>
可以让你指定 Python 的版本,<list_of_packages>
是要在环境中安装的包的名称列表。(source) activate <env_name>
。Windows 中不需要使用 source
。进入环境后,你可以看到类似 (<env_name>) ~ $
之类的提示,这证明你已经成功地进入并工作在指定的 Python 环境下。之后你可以像之前一样安装和管理各种包了,由于新建的环境只安装了几个默认和包,所以你可能需要安装其他你需要的包。conda deactivate
。conda env list
。这个命令可以列出系统中存在的环境,当前工作的环境前会出现一个星号 *
。如图所示: (base)
(或 (root)
)表示默认的 Python 环境。conda env remove -n <env_name>
。conda env export > environment.yaml
。这会导出一个环境文件 environment.yaml
。要通过环境文件创建环境,使用 conda env create -f environment.yaml
,这样会创建一个具有在 environment.yaml
中列出的库的新环境。要详细了解 conda,请查看这篇文章:Conda myths and misconceptions,此外,conda 的官方文档也是很好的材料。