Skip to content

Commit 0351326

Browse files
author
刘晓东
committed
feat: 算法提交
1 parent ae58eca commit 0351326

31 files changed

+643
-157
lines changed

LeetCode/1034. 边界着色.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// 给你一个大小为 m x n 的整数矩阵 grid ,表示一个网格。另给你三个整数 row、col 和 color 。网格中的每个值表示该位置处的网格块的颜色。
2+
3+
// 两个网格块属于同一 连通分量 需满足下述全部条件:
4+
5+
// 两个网格块颜色相同
6+
// 在上、下、左、右任意一个方向上相邻
7+
// 连通分量的边界 是指连通分量中满足下述条件之一的所有网格块:
8+
9+
// 在上、下、左、右四个方向上与不属于同一连通分量的网格块相邻
10+
// 在网格的边界上(第一行/列或最后一行/列)
11+
// 请你使用指定颜色 color 为所有包含网格块 grid[row][col] 的 连通分量的边界 进行着色,并返回最终的网格 grid 。
12+
13+
//  
14+
15+
// 示例 1:
16+
17+
// 输入:grid = [[1,1],[1,2]], row = 0, col = 0, color = 3
18+
// 输出:[[3,3],[3,2]]
19+
// 示例 2:
20+
21+
// 输入:grid = [[1,2,2],[2,3,2]], row = 0, col = 1, color = 3
22+
// 输出:[[1,3,3],[2,3,3]]
23+
// 示例 3:
24+
25+
// 输入:grid = [[1,1,1],[1,1,1],[1,1,1]], row = 1, col = 1, color = 2
26+
// 输出:[[2,2,2],[2,1,2],[2,2,2]]
27+
//  
28+
29+
// 提示:
30+
31+
// m == grid.length
32+
// n == grid[i].length
33+
// 1 <= m, n <= 50
34+
// 1 <= grid[i][j], color <= 1000
35+
// 0 <= row < m
36+
// 0 <= col < n
37+
38+
39+
// 来源:力扣(LeetCode)
40+
// 链接:https://leetcode-cn.com/problems/coloring-a-border
41+
// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
42+
43+
44+
45+
46+
/**
47+
* @param {number[][]} grid
48+
* @param {number} row
49+
* @param {number} col
50+
* @param {number} color
51+
* @return {number[][]}
52+
*/
53+
var colorBorder = function(grid, row, col, color) {
54+
const m = grid.length, n = grid[0].length;
55+
const visited = new Array(m).fill(0).map(() => new Array(n).fill(0));
56+
const borders = [];
57+
const originalColor = grid[row][col];
58+
const direc = [[0, 1], [0, -1], [1, 0], [-1, 0]];
59+
const q = [];
60+
q.push([row, col]);
61+
visited[row][col] = true;
62+
while (q.length) {
63+
const node = q.pop();
64+
const x = node[0], y = node[1];
65+
66+
let isBorder = false;
67+
for (let i = 0; i < 4; i++) {
68+
const nx = direc[i][0] + x, ny = direc[i][1] + y;
69+
if (!(nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] === originalColor)) {
70+
isBorder = true;
71+
} else if (!visited[nx][ny]) {
72+
visited[nx][ny] = true;
73+
q.push([nx, ny]);
74+
}
75+
}
76+
if (isBorder) {
77+
borders.push([x, y]);
78+
}
79+
}
80+
for (let i = 0; i < borders.length; i++) {
81+
const x = borders[i][0], y = borders[i][1];
82+
grid[x][y] = color;
83+
}
84+
return grid;
85+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// 给你两个数组,arr1 和 arr2,
2+
3+
// arr2 中的元素各不相同
4+
// arr2 中的每个元素都出现在 arr1 中
5+
// 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
6+
7+
//  
8+
9+
// 示例:
10+
11+
// 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
12+
// 输出:[2,2,2,1,4,3,3,9,6,7,19]
13+
//  
14+
15+
// 提示:
16+
17+
// 1 <= arr1.length, arr2.length <= 1000
18+
// 0 <= arr1[i], arr2[i] <= 1000
19+
// arr2 中的元素 arr2[i] 各不相同
20+
// arr2 中的每个元素 arr2[i] 都出现在 arr1 中
21+
22+
// 来源:力扣(LeetCode)
23+
// 链接:https://leetcode-cn.com/problems/relative-sort-array
24+
// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
25+
26+
27+
28+
29+
/**
30+
* @param {number[]} arr1
31+
* @param {number[]} arr2
32+
* @return {number[]}
33+
*/
34+
var relativeSortArray = function(arr1, arr2, r = [], h = Object.create(null)) {
35+
arr1.forEach(v => h[v] = (h[v] || 0) + 1)
36+
arr2.forEach(v => (r = r.concat(Array(h[v]).fill(v)), delete h[v]))
37+
return Object.keys(h).forEach(v => r = r.concat(Array(h[v]).fill(v))), r
38+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// 给你一个按 YYYY-MM-DD 格式表示日期的字符串 date,请你计算并返回该日期是当年的第几天。
2+
3+
// 通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。
4+
5+
//  
6+
7+
// 示例 1:
8+
9+
// 输入:date = "2019-01-09"
10+
// 输出:9
11+
// 示例 2:
12+
13+
// 输入:date = "2019-02-10"
14+
// 输出:41
15+
// 示例 3:
16+
17+
// 输入:date = "2003-03-01"
18+
// 输出:60
19+
// 示例 4:
20+
21+
// 输入:date = "2004-03-01"
22+
// 输出:61
23+
//  
24+
25+
// 提示:
26+
27+
// date.length == 10
28+
// date[4] == date[7] == '-',其他的 date[i] 都是数字。
29+
// date 表示的范围从 1900 年 1 月 1 日至 2019 年 12 月 31 日。
30+
31+
// 来源:力扣(LeetCode)
32+
// 链接:https://leetcode-cn.com/problems/day-of-the-year
33+
// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
34+
35+
36+
37+
/**
38+
* @param {string} date
39+
* @return {number}
40+
*/
41+
var dayOfYear = function(date) {
42+
const [year,month,day]=date.split('-');
43+
const start = new Date(year+'-01-01').getTime();
44+
const end = new Date(date).getTime();
45+
return (end-start)/1000/3600/24+1
46+
};
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// 给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。
2+
3+
// 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。
4+
5+
//  
6+
7+
// 示例 1:
8+
9+
10+
11+
// 输入:text = "nlaebolko"
12+
// 输出:1
13+
// 示例 2:
14+
15+
16+
17+
// 输入:text = "loonbalxballpoon"
18+
// 输出:2
19+
// 示例 3:
20+
21+
// 输入:text = "leetcode"
22+
// 输出:0
23+
//  
24+
25+
// 提示:
26+
27+
// 1 <= text.length <= 10^4
28+
// text 全部由小写英文字母组成
29+
30+
31+
// 来源:力扣(LeetCode)
32+
// 链接:https://leetcode-cn.com/problems/maximum-number-of-balloons
33+
// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
34+
35+
36+
37+
/**
38+
* @param {string} text
39+
* @return {number}
40+
*/
41+
var maxNumberOfBalloons = function(text) {
42+
let arr = Array(5).fill(0);
43+
for (let i = 0; i < text.length; i++) {
44+
if (text[i] === 'b') arr[0]++;
45+
if (text[i] === 'a') arr[1]++;
46+
if (text[i] === 'l') arr[2]++;
47+
if (text[i] === 'o') arr[3]++;
48+
if (text[i] === 'n') arr[4]++;
49+
}
50+
arr[2] = Math.floor(arr[2] / 2)
51+
arr[3] = Math.floor(arr[3] / 2)
52+
return Math.min(...arr)
53+
};

LeetCode/229. 求众数 II.js

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -41,46 +41,22 @@
4141
* @return {number[]}
4242
*/
4343
var majorityElement = function(nums) {
44-
let element1 = 0;
45-
let element2 = 0;
46-
let vote1 = 0;
47-
let vote2 = 0;
48-
44+
let element1 = 0,element2 = 0,vote1 = 0,vote2 = 0;
4945
for (const num of nums) {
50-
if (vote1 > 0 && num === element1) { //如果该元素为第一个元素,则计数加1
51-
vote1++;
52-
} else if (vote2 > 0 && num === element2) { //如果该元素为第二个元素,则计数加1
53-
vote2++;
54-
} else if (vote1 === 0) { // 选择第一个元素
55-
element1 = num;
56-
vote1++;
57-
} else if (vote2 === 0) { // 选择第二个元素
58-
element2 = num;
59-
vote2++;
60-
} else { //如果三个元素均不相同,则相互抵消1次
61-
vote1--;
62-
vote2--;
63-
}
46+
if (vote1 > 0 && num === element1) vote1++;
47+
else if (vote2 > 0 && num === element2) vote2++;
48+
else if (vote1 === 0) (element1 = num,vote1++);
49+
else if (vote2 === 0) (element2 = num,vote2++);
50+
else (vote1--,vote2--);
6451
}
65-
66-
let cnt1 = 0;
67-
let cnt2 = 0;
52+
let cnt1 = 0,cnt2 = 0;
6853
for (const num of nums) {
69-
if (vote1 > 0 && num === element1) {
70-
cnt1++;
71-
}
72-
if (vote2 > 0 && num === element2) {
73-
cnt2++;
74-
}
54+
if (vote1 > 0 && num === element1) cnt1++;
55+
if (vote2 > 0 && num === element2) cnt2++;
7556
}
7657
// 检测元素出现的次数是否满足要求
7758
const ans = [];
78-
if (vote1 > 0 && cnt1 > Math.floor(nums.length / 3)) {
79-
ans.push(element1);
80-
}
81-
if (vote2 > 0 && cnt2 > Math.floor(nums.length / 3)) {
82-
ans.push(element2);
83-
}
84-
59+
if (vote1 > 0 && cnt1 > Math.floor(nums.length / 3)) ans.push(element1);
60+
if (vote2 > 0 && cnt2 > Math.floor(nums.length / 3)) ans.push(element2);
8561
return ans;
8662
};

LeetCode/384. 打乱数组.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// 给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。
2+
3+
// 实现 Solution class:
4+
5+
// Solution(int[] nums) 使用整数数组 nums 初始化对象
6+
// int[] reset() 重设数组到它的初始状态并返回
7+
// int[] shuffle() 返回数组随机打乱后的结果
8+
//  
9+
10+
// 示例:
11+
12+
// 输入
13+
// ["Solution", "shuffle", "reset", "shuffle"]
14+
// [[[1, 2, 3]], [], [], []]
15+
// 输出
16+
// [null, [3, 1, 2], [1, 2, 3], [1, 3, 2]]
17+
18+
// 解释
19+
// Solution solution = new Solution([1, 2, 3]);
20+
// solution.shuffle(); // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。例如,返回 [3, 1, 2]
21+
// solution.reset(); // 重设数组到它的初始状态 [1, 2, 3] 。返回 [1, 2, 3]
22+
// solution.shuffle(); // 随机返回数组 [1, 2, 3] 打乱后的结果。例如,返回 [1, 3, 2]
23+
//  
24+
25+
// 提示:
26+
27+
// 1 <= nums.length <= 200
28+
// -106 <= nums[i] <= 106
29+
// nums 中的所有元素都是 唯一的
30+
// 最多可以调用 5 * 104 次 reset 和 shuffle
31+
32+
// 来源:力扣(LeetCode)
33+
// 链接:https://leetcode-cn.com/problems/shuffle-an-array
34+
// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
35+
36+
37+
38+
/**
39+
* @param {number[]} nums
40+
*/
41+
var Solution = function(nums) {
42+
this.resetArr = nums.slice();
43+
this.arr = nums;
44+
};
45+
46+
/**
47+
* @return {number[]}
48+
*/
49+
Solution.prototype.reset = function() {
50+
this.arr = this.resetArr.slice();
51+
return this.arr;
52+
};
53+
54+
/**
55+
* @return {number[]}
56+
*/
57+
Solution.prototype.shuffle = function() {
58+
for (let i = 0; i < this.arr.length; ++i) {
59+
const j = Math.floor(Math.random() * (this.arr.length - i)) + i;
60+
const temp = this.arr[i];
61+
this.arr[i] = this.arr[j];
62+
this.arr[j] = temp;
63+
}
64+
return this.arr;
65+
};
66+
67+
/**
68+
* Your Solution object will be instantiated and called as such:
69+
* var obj = new Solution(nums)
70+
* var param_1 = obj.reset()
71+
* var param_2 = obj.shuffle()
72+
*/

0 commit comments

Comments
 (0)