Skip to content

Commit cf0649e

Browse files
committed
新增文章
1 parent 3538275 commit cf0649e

File tree

9 files changed

+813
-13
lines changed

9 files changed

+813
-13
lines changed

docs/.vuepress/config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ const algorithmArr = [
3535
'171',
3636
'198',
3737
'216',
38+
'219',
3839
'242',
40+
'389',
41+
'458',
42+
'507',
3943
'520',
4044
'674',
4145
'704',

docs/algorithm/219.md

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# 画解算法:219. 存在重复元素 II
2+
3+
## 题目链接
4+
5+
https://leetcode-cn.com/problems/contains-duplicate-ii/
6+
7+
## 题目描述
8+
9+
给定一个整数数组和一个整数 `k`,判断数组中是否存在两个不同的索引 `i` 和 `j`,使得 `nums [i] = nums [j]`,并且 `i``j` 的差的绝对值最大为 `k`
10+
11+
示例 1:
12+
13+
```bash
14+
输入: nums = [1,2,3,1], k = 3
15+
输出: true
16+
```
17+
18+
示例 2:
19+
20+
```bash
21+
输入: nums = [1,0,1,1], k = 1
22+
输出: true
23+
```
24+
25+
示例 3:
26+
27+
```bash
28+
输入: nums = [1,2,3,1,2,3], k = 2
29+
输出: false
30+
```
31+
32+
## 解题方案
33+
34+
### 思路
35+
36+
- 标签:哈希
37+
- 维护一个哈希表,里面始终最多包含k个元素,当出现重复值时则说明在k距离内存在重复元素
38+
- 每次遍历一个元素则将其加入哈希表中,如果哈希表的大小大于k,则移除最前面的数字
39+
- 时间复杂度:O(n),n为数组长度
40+
41+
### 代码
42+
43+
- Java版本
44+
45+
```Java
46+
class Solution {
47+
public boolean containsNearbyDuplicate(int[] nums, int k) {
48+
HashSet<Integer> set = new HashSet<>();
49+
for(int i = 0; i < nums.length; i++) {
50+
if(set.contains(nums[i])) {
51+
return true;
52+
}
53+
set.add(nums[i]);
54+
if(set.size() > k) {
55+
set.remove(nums[i - k]);
56+
}
57+
}
58+
return false;
59+
}
60+
}
61+
```
62+
63+
- JavaScript版本
64+
65+
```JavaScript
66+
/**
67+
* @param {number[]} nums
68+
* @param {number} k
69+
* @return {boolean}
70+
*/
71+
var containsNearbyDuplicate = function(nums, k) {
72+
const set = new Set();
73+
for(let i = 0; i < nums.length; i++) {
74+
if(set.has(nums[i])) {
75+
return true;
76+
}
77+
set.add(nums[i]);
78+
if(set.size > k) {
79+
set.delete(nums[i - k]);
80+
}
81+
}
82+
return false;
83+
};
84+
```
85+
86+
87+
### 画解
88+
89+
![1.png](https://i.loli.net/2019/07/10/5d25b62af150495696.png)
90+
![2.png](https://i.loli.net/2019/07/10/5d25b62b0131399595.png)
91+
![3.png](https://i.loli.net/2019/07/10/5d25b62b1945792749.png)
92+
![4.png](https://i.loli.net/2019/07/10/5d25b62b1905488058.png)
93+
![5.png](https://i.loli.net/2019/07/10/5d25b62b5573265130.png)
94+
![6.png](https://i.loli.net/2019/07/10/5d25b64c8bd2359035.png)
95+
96+
97+
98+
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
99+
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
100+
101+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

docs/algorithm/389.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# 画解算法:389. 找不同
2+
3+
## 题目链接
4+
5+
https://leetcode-cn.com/problems/find-the-difference/
6+
7+
## 题目描述
8+
9+
给定两个字符串 `s``t`,它们只包含小写字母。
10+
11+
字符串 `t` 由字符串 `s` 随机重排,然后在随机位置添加一个字母。
12+
13+
请找出在 `t` 中被添加的字母。
14+
15+
示例:
16+
17+
```bash
18+
输入:
19+
s = "abcd"
20+
t = "abcde"
21+
22+
输出:
23+
e
24+
25+
解释:
26+
'e' 是那个被添加的字母。
27+
```
28+
29+
## 解题方案
30+
31+
### 思路
32+
33+
- 标签:哈希表
34+
- 本题最容易想到的就是使用哈希表进行运算,遍历第一个字符串标记出现的字符数量,再遍历第二个减去出现的数量,直到遇到为0或者原哈希表就不存在的情况
35+
36+
- 标签:异或运算
37+
- 除了上述方法外,会有一个更tricky的解法,就是使用字符(**注意不是字符串**)异或运算,尽管并没有降低时间复杂度,但也是一种开阔思路的解题方式
38+
- 使用异或运算可以解题主要因为异或运算有以下几个特点:
39+
- 一个数和0做XOR运算等于本身:a⊕0 = a
40+
- 一个数和其本身做XOR运算等于0:a⊕a = 0
41+
- XOR运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
42+
- 故而在以上的基础条件上,将所有数字按照顺序做抑或运算,最后剩下的结果即为唯一的数字
43+
- 时间复杂度:O(m+n),m为字符串s的长度,n为字符串t的长度
44+
45+
### 代码
46+
47+
- Java版本
48+
49+
```Java
50+
class Solution {
51+
public char findTheDifference(String s, String t) {
52+
char ans = t.charAt(t.length()-1);
53+
for(int i = 0; i < s.length(); i++) {
54+
ans ^= s.charAt(i);
55+
ans ^= t.charAt(i);
56+
}
57+
return ans;
58+
}
59+
}
60+
```
61+
62+
- JavaScript版本
63+
64+
JavaScript由于**没有字符位运算**所以无法使用异或运算解法。故而使用了第一种哈希表的解法
65+
66+
```JavaScript
67+
/**
68+
* @param {string} s
69+
* @param {string} t
70+
* @return {character}
71+
*/
72+
var findTheDifference = function(s, t) {
73+
const map = new Map();
74+
for(let i = 0; i < s.length; i++) {
75+
const val = map.get(s[i]);
76+
map.set(s[i], val === undefined ? 1 : val + 1);
77+
}
78+
for(let i = 0; i < t.length; i++) {
79+
const val = map.get(t[i]);
80+
if(val === 0 || val === undefined) {
81+
return t[i];
82+
} else {
83+
map.set(t[i], val - 1);
84+
}
85+
}
86+
};
87+
```
88+
89+
90+
### 画解
91+
92+
![1.png](https://i.loli.net/2019/07/12/5d27d41cc97fd54063.png)
93+
![2.png](https://i.loli.net/2019/07/12/5d27d41cd223356262.png)
94+
![3.png](https://i.loli.net/2019/07/12/5d27d4f71cef875296.png)
95+
96+
97+
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
98+
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
99+
100+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

docs/algorithm/458.md

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# 画解算法:458. 可怜的小猪
2+
3+
## 题目链接
4+
5+
https://leetcode-cn.com/problems/poor-pigs/
6+
7+
## 题目描述
8+
9+
有 1000 只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在 15 分钟内死去。
10+
11+
问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪?
12+
13+
回答这个问题,并为下列的进阶问题编写一个通用算法。
14+
15+
进阶:
16+
17+
假设有 `n` 只水桶,猪饮水中毒后会在 `m` 分钟内死亡,你需要多少猪`(x)`就能在 `p` 分钟内找出 “有毒” 水桶?这 `n` 只水桶里有且仅有一只有毒的桶。
18+
19+
提示:
20+
21+
1. 可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。
22+
2. 小猪喝完水后,必须有 m 分钟的冷却时间。在这段时间里,只允许观察,而不允许继续饮水。
23+
3. 任何给定的桶都可以无限次采样(无限数量的猪)。
24+
25+
26+
## 解题方案
27+
28+
### 思路
29+
30+
- 标签:数学
31+
-
32+
- 时间复杂度:O(logn),n为桶的个数
33+
34+
### 代码
35+
36+
- Java版本
37+
38+
```Java
39+
class Solution {
40+
public int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
41+
double times = minutesToTest / minutesToDie;
42+
double base = times + 1;
43+
// radius ^ ans >= n
44+
// ans >= log(n) / log(radius)
45+
double ans = Math.log(buckets) / Math.log(base);
46+
return (int)Math.ceil(ans);
47+
}
48+
}
49+
```
50+
51+
- JavaScript版本
52+
53+
```JavaScript
54+
/**
55+
* @param {number} buckets
56+
* @param {number} minutesToDie
57+
* @param {number} minutesToTest
58+
* @return {number}
59+
*/
60+
var poorPigs = function(buckets, minutesToDie, minutesToTest) {
61+
const times = minutesToTest / minutesToDie;
62+
const base = times + 1;
63+
// radius ^ ans >= n
64+
// ans >= log(n) / log(radius)
65+
const ans = Math.log(buckets) / Math.log(base);
66+
return Math.ceil(ans);
67+
};
68+
```
69+
70+
71+
### 画解
72+
73+
74+
75+
76+
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
77+
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
78+
79+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

0 commit comments

Comments
 (0)