每周完成一个ARTS
-
每周至少做一个 leetcode 的算法题
-
阅读并点评至少一篇英文技术文章
-
学习至少一个技术技巧
-
分享一篇有观点和思考的技术文章。
-
(也就是 Algorithm、Review、Tip、Share 简称ARTS)
Algorithm
215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
解法1
时间复杂度:O(nlogn)
思路:使用快速排序,将数组排序,然后找到第k个最大的元素。这里需要复习一下快速一下快速排序的实现方法。int partition(vector<int> &vec, int left, int right) { int base = vec[left]; while(left < right) { while(vec[right] >= base && left < right) right --; swap(vec[left], vec[right]); while(vec[left] <= base && left < right) left ++; swap(vec[left], vec[right]); } return left; } int fast_sort(vector<int> &vec, int left, int right) { if (left < right) { int point = partition(vec, left, right); fast_sort(vec, left, point - 1); fast_sort(vec, point + 1, right); } return 0; } int findKthLargest(vector<int> &nums, int k) { if (k > nums.size()) return 0; fast_sort(nums, 0, nums.size() - 1); return nums[nums.size() - k]; }
解法2
时间复杂度:O(nlogn)
思路:利用快排的思想,所获取的patiton即已经排好序的位置,将其与倒数第k的位置作比较。
若相等,则正好是所求的第k大位置;
若小于,则继续对[patition + 1, high]求patition;
若大于,则继续对[low, patition - 1]求pattion。int partition(vector<int> &vec, int left, int right) { int base = vec[left]; while(left < right) { while(vec[right] >= base && left < right) right --; swap(vec[left], vec[right]); while(vec[left] <= base && left < right) left ++; swap(vec[left], vec[right]); } return left; } int findKthLargest(vector<int> &nums, int k) { if (k > nums.size()) return 0; int point = 0; int low = 0, high = nums.size() - 1; int dest = nums.size() - k; while(1) { point = partition(nums, low, high); if (point == dest) return nums[dest]; else if (point > dest) high = point - 1; else low = point + 1; } return 0; }
Review
go语言官方文档,主要介绍了在win/mac/liunux下载、安装、测试、卸载go语言发布包的方法
the tour of go的使用方法
- 提供交互界面来学习go的语法
- 可以前后翻页,点击run来编译和运行交互界面上的程序,点击format可以格式化代码。
- 可以设置本地语言,方便非英语使用者学习go
- 指南可以下载到本地
- 该指南是建立在运行于golang.org远程服务器的web服务,有使用的时间限制与执行时间限制
package
- 每个go程序都是由package组成的
- 程序以package main开始运行
- package名与import路径名最后一个目录名相同
- import多个package需要加上小括号,也可以写成多个import语句
exported
- 可被其他模块调用的函数或变量需要以大写字母开头
functions
-
函数可添加0个或多个参数
-
函数参数变量名放在类型之前,返回值类型写在末尾
-
如果函数参数有同一类型变量,则可以将所有类型移除,只在最后添加一个类型
-
函数支持返回多个结果,函数调用者需要以:=来进行接收结果,对应地返回值类型需要以()写在函数名末尾
-
返回值重命名,返回值可以函数顶部作为已定义的变量,return返回没有参数,可以裸返回,这种情况应该只用于短函数中,如果用于长函数会损害可读性
变量
-
var声明变量列表,类型需要写在最后
-
var后可添加变量初始化
-
在函数内部可使用:=来初始化变量,不需要写类型,可根据初始化值的类型自动判断,在函数外部不可这么使用
-
声明多种类型的变量
-
0值
-
变量如果声明时,如果没有写明初始值,则会默认赋为0值:
-
-
基本类型
-
类型转换
- 使用表达式T(v)进行类型转换
- go不支持类型的自动转换,不同类型的转换必须写出来
-
const
- 声明变量后,变量不可被更改,即为常量
- 不可使用:=声明变量
Tip
解决unzip在linux下解压中文名zip文件出现乱码的问题
Share