Fork me on GitHub

ARTS(8)

ARTS 第八周

每周完成一个ARTS(也就是 Algorithm、Review、Tip、Share 简称ARTS):

  1. 每周至少做一个 leetcode 的算法题
  2. 阅读并点评至少一篇英文技术文章
  3. 学习至少一个技术技巧
  4. 分享一篇有观点和思考的技术文章。

Algorithm

力扣 910. 最小差值 II

给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中。

在此过程之后,我们得到一些数组 B

返回 B 的最大值和 B 的最小值之间可能存在的最小差值。

示例 1:

1
2
3
输入:A = [1], K = 0
输出:0
解释:B = [1]

示例 2:

1
2
3
输入:A = [0,10], K = 2
输出:6
解释:B = [2,8]

示例 3:

1
2
3
输入:A = [1,3,6], K = 3
输出:3
解释:B = [4,6,3]

思路:划分左右区间,然后枚举分界点的位置,找到最小差值,详细看代码注解。

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

import org.junit.Assert;
import org.junit.Test;

import java.util.Arrays;

// 这里把中文标题当作类名只是为了方便使用,class 名称不建议使用中文
public class 最小差值II {

@Test
public void testResult() {
int[] A = {1, 3, 6};
int K = 3;
int result = smallestRangeII(A, K);
Assert.assertEquals(result, 3);
}

public int smallestRangeII(int[] A, int K) {
Arrays.sort(A);
int n = A.length;
int result = A[n - 1] - A[0];
// 按 i 的位置划分左右区间,左区间元素全部+K,右区间元素全部-K
for (int i = 1; i < n; ++i) {
int min = Math.min(A[0] + K, A[i] - K); // 左右区间的最小值选最小
int max = Math.max(A[i - 1] + K, A[n - 1] - K);
result = Math.min(result, max - min);
}
return result;
}
}

Review

本周分享英文文章为:Weekend read, Serverless, Docker, Kubernetes

解读见本站另一篇文章:K8s 入门笔记

Tip

  1. 在印象笔记的笔记本中,将各条笔记按照标题分类,如下图:

能明显提高工作效率和条理性。

  1. 在笔记中,特意增加一页”解惑”,把每天遇到的难题记录下来,抽空用来咨询公司其他老司机,把自己的思路和答案写在后面。

Share

分享内容见本站另一篇文章,点链接:深度学习名词辨析

-------------The End-------------