每周完成一个ARTS
-
每周至少做一个 leetcode 的算法题
-
阅读并点评至少一篇英文技术文章
-
学习至少一个技术技巧
-
分享一篇有观点和思考的技术文章。
-
(也就是 Algorithm、Review、Tip、Share 简称ARTS)
Algorithm
11. 盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的。
解法1
暴力破解法
时间复杂度:O(n^2)
思路:两次遍历数组,取长度较小值与两点下标之差的乘积即面积,记录下面积最大值
int maxArea(vector<int>& height) { int var = 0; int high = 0; int area = 0; for (int i = 0; i < height.size(); i ++) { for (int j = i + 1; j < height.size(); j ++) { high = height[i] > height[j] ? height[j]:height[i]; area = high * (j - i); if (area > var) { var = area; } } } return var; }
解法2
双指针
时间复杂度:O(n)
思路:头尾指针,向中间移动,每次都移动长度较小一端(因为宽度逐渐缩小,以该点的长度为基准的面积不可能再大了),计算面积,取面积最大值
int maxArea(vector<int>& height) { int left = 0, right = height.size() - 1; int var = 0; int high = 0; int area = 0; while(left < right) { if (height[left] <= height[right]) { high = height[left]; left ++; } else { high = height[right]; right --; } area = high * (right - left + 1); if (area > var) { var = area; } } return var; }
Review
https://tour.golang.org/flowcontrol/1
-
for
-
go只有一个循环结构,for循环
-
三部分:
- init初始声明
- 变量声明,且声明的变量只能用于for循环语句中
- condition条件表达式
- 条件表达式的值为false时,循环停止
- post赋值表达式
- init初始声明
-
for循环的{}必须一直存在
-
init post语句是可选的
-
当init post都不存在时,两个;可去除,for循环类似c语句的while循环
-
-
无限循环
-
-
if
-
条件表达式不需要(),但是执行语句需要{}
-
if支持变量声明,该变量只能用于if与else执行语句中
-
-
switch
-
每个case后不需要写break,go语句自动提供break
-
switch后不加条件的话类似于if then else语句
-
-
defer
-
defer声明的语句只在所在函数返回时才执行
-
一个函数内包括多个defer语句,先声明先执行
-
Tip
这周由于工作需求,看了下iptables转发相关的知识
Share
-