Skip to content

Commit ac22170

Browse files
author
luzhipeng
committed
合并master
2 parents 7594c5c + 1ec407e commit ac22170

7 files changed

+491
-1
lines changed

Diff for: daily/2019-06-17.md

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# 毎日一题 - 744. find smallest letter greater than target
2+
3+
## 信息卡片
4+
* 时间:2019-06-17
5+
* 题目链接:https://leetcode.com/problems/find-smallest-letter-greater-than-target/
6+
* tag:`Array`
7+
8+
## 题目描述
9+
```
10+
Given a list of sorted characters letters containing only lowercase letters, and given a target letter target, find the smallest element in the list that is larger than the given target.
11+
12+
Letters also wrap around. For example, if the target is target = 'z' and letters = ['a', 'b'], the answer is 'a'.
13+
14+
Examples:
15+
Input:
16+
letters = ["c", "f", "j"]
17+
target = "a"
18+
Output: "c"
19+
20+
Input:
21+
letters = ["c", "f", "j"]
22+
target = "c"
23+
Output: "f"
24+
25+
Input:
26+
letters = ["c", "f", "j"]
27+
target = "d"
28+
Output: "f"
29+
30+
Input:
31+
letters = ["c", "f", "j"]
32+
target = "g"
33+
Output: "j"
34+
35+
Input:
36+
letters = ["c", "f", "j"]
37+
target = "j"
38+
Output: "c"
39+
40+
Input:
41+
letters = ["c", "f", "j"]
42+
target = "k"
43+
Output: "c"
44+
Note:
45+
letters has a length in range [2, 10000].
46+
letters consists of lowercase letters, and contains at least 2 unique letters.
47+
target is a lowercase letter.
48+
```
49+
50+
## 思路
51+
二分查找,提高速度
52+
要求是查找某一个元素,又是在有序的集合中。
53+
所以我们可以用二分查找
54+
1. 排除两种情况;target 小于首元素|| target 大于等于尾元素 => 目标都是首元素
55+
2. 当target>=letters[mid] 时(我们要的值一定在右边),调整左区间 min = mid+1;
56+
3. 当target< letters[mid] 时,调整右区间 max = mid-1;
57+
4. 循环终止条件是 min > max; 最终返回min位置元素
58+
59+
## 建议
60+
在leetcode上找一个数组稍微长一点的测试用例,在纸上画出整个过程;对理解很有帮助
61+
62+
## 参考答案
63+
```js
64+
/**
65+
* @param {character[]} letters
66+
* @param {character} target
67+
* @return {character}
68+
*/
69+
var nextGreatestLetter = function(letters, target) {
70+
const length = letters.length
71+
let min = 0;
72+
let max = length - 1;
73+
if(target >= letters[length-1] || target < letters[0]) return letters[0];
74+
while(min <= max) {
75+
const mid = (max+min) >> 1
76+
if(target >= letters[mid]) {
77+
min = mid + 1;
78+
} else {
79+
max = mid - 1;
80+
}
81+
}
82+
return letters[min]
83+
};
84+
```

Diff for: daily/2019-06-20.md

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# 毎日一题 - 594. Longest Harmonious Subsequence
2+
3+
## 信息卡片
4+
* 时间:2019-06-20
5+
* 题目链接:https://leetcode.com/problems/longest-harmonious-subsequence/
6+
* tag:`Array`
7+
8+
## 题目描述
9+
```
10+
We define a harmounious array as an array where the difference between its maximum value and its minimum value is exactly 1.
11+
12+
Now, given an integer array, you need to find the length of its longest harmonious subsequence among all its possible subsequences.
13+
14+
Example 1:
15+
16+
Input: [1,3,2,2,5,2,3,7]
17+
Output: 5
18+
Explanation: The longest harmonious subsequence is [3,2,2,2,3].
19+
```
20+
21+
## 思路
22+
1. 将数组中的值作为一个对象中的属性,出现的次数就是属性值
23+
2. 属性差一的值相加,获取最大的,否则返回0;
24+
25+
## 参考答案
26+
```js
27+
/**
28+
* @param {number[]} nums
29+
* @return {number}
30+
* 使用ES6中的Map
31+
*/
32+
var findLHS = function(nums) {
33+
if(!nums.length) return 0;
34+
const map = new Map();
35+
let max = 0;
36+
for(let i = 0; i<nums.length; i++) {
37+
let target = nums[i]
38+
if (map.has(target)) {
39+
map.set(target, map.get(target)+1);
40+
} else {
41+
map.set(target, 1);
42+
}
43+
}
44+
for (let key of map.keys()) {
45+
if(map.has(key+1)) {
46+
max = Math.max(map.get(key)+map.get(key+1), max);
47+
}
48+
}
49+
return max
50+
};
51+
```
52+
53+
### 其它优秀解法
54+
```js
55+
/**
56+
* @param {number[]} nums
57+
* @return {number}
58+
* for...in遍历
59+
*/
60+
var findLHS = function(nums) {
61+
if(!nums.length) return 0;
62+
const counts = {};
63+
let max = 0;
64+
for(let i = 0; i<nums.length; i++) {
65+
if (counts[nums[i]]) {
66+
counts[nums[i]] += 1;
67+
} else {
68+
counts[nums[i]] = 1;
69+
}
70+
}
71+
for (let key in counts) { // for...in性能低
72+
if(counts[+key+1]) {
73+
max = Math.max(counts[key]+counts[+key+1], max)
74+
}
75+
}
76+
return max
77+
};
78+
79+
/**
80+
* @param {number[]} nums
81+
* @return {number}
82+
* 普通遍历
83+
*/
84+
var findLHS = function(nums) {
85+
if(!nums.length) return 0;
86+
const counts = {};
87+
let max = 0;
88+
for(let i = 0; i<nums.length; i++) {
89+
if (counts[nums[i]]) {
90+
counts[nums[i]] += 1;
91+
} else {
92+
counts[nums[i]] = 1;
93+
}
94+
}
95+
for (let i = 0; i < nums.length; i++) { // 有多余的无效遍历
96+
if (counts[nums[i] + 1]) {
97+
max = Math.max(max, counts[nums[i]] + counts[nums[i] + 1]);
98+
}
99+
}
100+
return max
101+
};
102+
```

Diff for: daily/2019-07-25.md

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# 毎日一题 - 9. Palindrome number
2+
3+
## 信息卡片
4+
5+
- 时间:2019-07-25
6+
- 题目链接:https://leetcode.com/problems/palindrome-number/submissions/
7+
- tag:`Math`
8+
9+
## 题目描述
10+
11+
```
12+
Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.
13+
14+
Example 1:
15+
16+
Input: 121
17+
Output: true
18+
19+
Example 2:
20+
21+
Input: -121
22+
Output: false
23+
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
24+
25+
Example 3:
26+
27+
Input: 10
28+
Output: false
29+
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
30+
31+
Follow up:
32+
33+
Coud you solve it without converting the integer to a string?
34+
```
35+
36+
## 参考答案
37+
38+
转成字符串方式
39+
1. 负数都是非回文数,10的整数倍不是回文。
40+
2. 将数字转为字符串,再逆序排列字符串。两者比较,相等就是回文数。
41+
42+
直接操作整数方式
43+
1. 复制x到temp;
44+
2. 取temp末尾数字,方式为temp与10的求余;组成新数reverse;
45+
3. 每取完一位,temp缩小10倍并且去掉小数。
46+
4. reverse要`先扩大十倍`再加上取下来的数
47+
5. 当temp === 0时,表示已经取完;reverse与x比较
48+
49+
50+
参考JavaScript代码:
51+
52+
```js
53+
/**
54+
* @param {number} x
55+
* @return {boolean}
56+
* 转成字符串
57+
*/
58+
var isPalindrome = function(x) {
59+
if(x < 0 ) return false;
60+
if(x === 0) return true;
61+
if(x % 10 === 0) return false;
62+
let reverse = '';
63+
let str = String(x);
64+
for(let i = str.length - 1; i >= 0; i--) {
65+
reverse += str[i]
66+
}
67+
return str === reverse
68+
};
69+
70+
/**
71+
* @param {number} x
72+
* @return {boolean}
73+
* 不转成字符串
74+
*/
75+
var isPalindrome = function(x) {
76+
if(x < 0 ) return false;
77+
if(x === 0) return true;
78+
if(x % 10 === 0) return false;
79+
let temp = x;
80+
let reverse = 0;
81+
while(temp > 0) {
82+
let num = temp % 10;
83+
temp = (temp - num)/10; // 或 temp = (temp / 10) >> 0,去除小数位
84+
reverse = reverse * 10 + num
85+
}
86+
return x === reverse
87+
};
88+
```
89+
90+
## 优秀解答
91+
92+
> 暂缺

Diff for: daily/README.md

+18
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ tag: `tree`
6060

6161
时间: 2019-06-14
6262

63+
### [744.find-smallest-letter-greater-than-target](./2019-06-17.md)
64+
65+
tag:`Array` `binary search`
66+
67+
时间:2019-06-17
68+
6369
### [letter-combinations-of-a-phone-number](./2019-06-18.md)
6470

6571
tag: `backtrack`
@@ -72,6 +78,12 @@ tag: `sql`
7278

7379
时间: 2019-06-19
7480

81+
### [594.longest-harmonious-subsequence](./2019-06-20.md)
82+
83+
tag:`Array`
84+
85+
时间:2019-06-20
86+
7587
### [nth-highest-salary](./2019-06-21.md)
7688

7789
tag: `sql`
@@ -144,6 +156,12 @@ tag:`发散思维`
144156

145157
时间: 2019-07-24
146158

159+
### [9.palindrome-number](./2019-07-25.md)
160+
161+
tag:`Math`
162+
163+
时间: 2019-07-25
164+
147165
### [将帅问题](./2019-07-26.md)
148166

149167
tag:`数据压缩`

0 commit comments

Comments
 (0)