不会飞的章鱼

熟能生巧,勤能补拙,静能生慧;念念不忘,必有回响。

题目

剑指 Offer 11. 旋转数组的最小数字

题解

双指针+二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//Java
class Solution {
public int minArray(int[] numbers) {
//设置left,right指针分别指向 numbers 数组左右两端
//left指向当前区间的最左边位置,所以初始化为0
int left = 0;
//right指向当前区间的最右边位置,所以初始化为nums.length - 1
int right = numbers.length - 1;

//循环进行二分查找,直到左端点位置超过右端点
while (left < right) {
//mid为中点
int mid = (left + right) / 2;
//当mid点所在元素大于数组末端的元素时,由于原来的数组是递增有序的,此时出现了异常,大的数在前面
//所以旋转点在[mid + 1,end]区间里面
if (numbers[mid] > numbers[right]) {
//所以旋转点在[mid + 1,end]区间里面,更新left的位置为mid + 1
left = mid + 1;
} else if (numbers[mid] < numbers[right]) {
//当mid点所在元素小于数组末端的元素时,由于原来的数组是递增有序的
//所以旋转点在[left,mid]区间里面,更新right的位置为mid
right = mid;
} else {
//采取遍历的方式
return findMin(numbers,left,right);
}
}
return numbers[left];
}
//从头到尾遍历numbers,获取最小值
public int findMin(int[] numbers,int left,int right) {
//默认为数组的第一个元素为最小值
int result = numbers[left];
//从头到尾遍历numbers
for (int i = left;i <= right;i++) {
//当发现此时遍历的元素值小于result
if (numbers[i] < result) {
//更新result
result = numbers[i];
}
}
return result;
}
}
阅读全文 »

基础语法、变量与运算

2274 · 第一个 Python 程序:打印 Hello World

1
2
3
# Your first python code
# print Hello World to console
print("Hello World")

2920 · 获取输入数据并打印它

1
2
3
# Please write your code here
name = input()
print(name)
阅读全文 »

为什么要懂复杂度分析

我们都知道,数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是算法一个非常重要的考量指标。那如何来衡量你编写的算法代码的执行效率呢?

你可能会有些疑惑,我把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小。为什么还要做时间、空间复杂度分析呢?这种分析方法能比我实实在在跑一遍得到的数据更准确吗?

首先,我可以肯定地说,你这种评估算法执行效率的方法是正确的。很多数据结构和算法书籍还给这种方法起了一个名字,叫事后统计法。但是,这种统计方法有非常大的局限性。

    1. 测试结果非常依赖测试环境
    1. 测试结果受数据规模的影响很大
阅读全文 »

崩溃的边缘

前天晚上,我使用我的电脑准备更新一下博客内容,结果发现报错:Ignoring local @import of "font-embedded.css,网上查了下,说是要更新Next版本到最新即可。

因此,痛定思痛,决定先整我的博客。

准备阶段

阅读全文 »

世间的本质,用眼睛是看不到的,那一刻我才明白这句话的真正含义。我是个盲人,但那又如何呢,世界不会因为我看不到而不再美丽;我不是侠岚,但那又怎样呢,我手中有属于我自己的侠岚印。 ——《风语咒》

十年之约,已走过十分之一。

这一年,你是否离自己的目标更近了一些,是否摆脱了内心的桎梏,重获新生?

三月的春风

三月,你意气风发,自信满满,觉得未来前途一切光明,朋友L交代给你的事情,你觉得百分百可以搞定。

阅读全文 »

join:将node加入集群

  • join前检查
  • discovery-token-ca-cert-hash:用于Node验证Master身份
  • token:用于Master验证Node身份

kubeadm init流程

  • 1,引导前的检查
  • 2,生成私钥和数字证书
  • 3,生成控制平面组件kubeconfig文件
  • 4,生成控制平面组件manifest文件
  • 5,下载镜像,等待控制平面启动
  • 6,保存MasterConfiguration
  • 7,设定Master标志
  • 8,进行基于TLS的安全引导相关配置
  • 9,安装DNS和kube-proxy插件

引导前检查

kubeadm init pre-flight check:

  • kubeadm版本与要安装的kubernetes版本的比对检查
  • kubernetes安装的系统需求检查
  • 其他检查:用户、主机、端口、swap、工具等
阅读全文 »

传统弹性伸缩的困境

从传统意义上,弹性伸缩主要解决的问题是容量规划与实践负载的矛盾。

蓝色水位线表示集群资源容量随着负载的增加不断扩容,红色曲线表示集群资源实际负载变化。

弹性伸缩就是要解决当实际负载增大,而集群资源容量没来得及反应的问题。

阅读全文 »