Skip to content

Commit 3931fec

Browse files
committed
feat: update 3 leetcode
1 parent a429dc9 commit 3931fec

File tree

3 files changed

+147
-0
lines changed

3 files changed

+147
-0
lines changed

leetcode/46.permutations.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* @lc app=leetcode id=46 lang=javascript
3+
*
4+
* [46] Permutations
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* 深度优先的思路 回溯算法
10+
* 如果使用广度优先遍历就得使用队列,然后编写结点类。队列中需要存储每一步的状态信息,需要存储的数据很大,真正能用到的很少。
11+
* 使用深度优先遍历,直接使用了系统栈,系统栈帮助我们保存了每一个结点的状态信息。我们不用编写结点类,不必手动编写栈完成深度优先遍历。
12+
* @param {number[]} nums
13+
* @return {number[][]}
14+
*/
15+
var permute = function(nums) {
16+
if (nums.length === 0) {
17+
return nums;
18+
}
19+
let len = nums.length;
20+
let ans = []; // 保存最终结果
21+
let used = []; // 保存数字是否已被使用
22+
23+
/**
24+
* 递归函数
25+
* @param {*} arr 原数组
26+
* @param {*} len 原数组长度,用于判断遍历是否结束
27+
* @param {*} depth 深度,用于判断当前的深度遍历是否结束
28+
* @param {*} path 保存当前的值
29+
* @param {*} used 保存当前的值是否已经使用
30+
* @param {*} ans 最终结果的数组
31+
* @returns
32+
*/
33+
function dfs(arr, len, depth, path, used, ans) {
34+
// 注意是遍历到数组的长度那一层结束的,尽管开始是从第 0 层,但结束是在数组的长度值那一层
35+
if (depth === len) {
36+
ans.push(path.slice());
37+
return;
38+
}
39+
40+
for (let i = 0; i < len; i++) {
41+
if (used[i]) {
42+
continue;
43+
}
44+
// 保存路径并标记使用
45+
path.push(arr[i]);
46+
used[i] = true;
47+
dfs(arr, len, depth + 1, path, used, ans);
48+
// 保存后重置状态
49+
path.pop();
50+
used[i] = false;
51+
}
52+
}
53+
54+
dfs(nums, len, 0, [], used, ans);
55+
56+
return ans;
57+
};
58+
// @lc code=end

leetcode/56.merge-intervals.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* @lc app=leetcode id=56 lang=javascript
3+
*
4+
* [56] Merge Intervals
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* @param {number[][]} intervals
10+
* @return {number[][]}
11+
*/
12+
var merge = function(intervals) {
13+
// 首先排序获得递增的顺序,方便后续判断
14+
const sorted = intervals.sort((arr1, arr2) => arr1[0] - arr2[0]);
15+
let i = 1; // 从第二位开始遍历,因为会和旧值比较
16+
let last = sorted[0]; // 保存初始的上一个值也就是第一个值
17+
let ans = []; // 保存结果内容
18+
19+
while (i < sorted.length) {
20+
const cur = sorted[i]; // 当前值
21+
const [firstOfLast, secondOfLast] = last;
22+
const [firstOfCur, secondOfCur] = cur;
23+
// 如果上一个值和当前值正好是连续的,就合并
24+
if (secondOfLast >= firstOfCur && secondOfLast <= secondOfCur) {
25+
last = [firstOfLast, secondOfCur];
26+
} else if (secondOfLast >= secondOfCur) {
27+
// 如果旧值的第二个数大于当前的第二个数,说明旧值区间覆盖了当前区间,所以可以直接使用旧值
28+
// last = last;
29+
} else {
30+
// 如果旧值区间和当前区间不重合,则保存旧值区间,并重置旧值区间
31+
ans.push(last);
32+
last = cur;
33+
}
34+
// 如果到了最后一个,直接保存
35+
if (i === sorted.length - 1) {
36+
ans.push(last);
37+
}
38+
i++;
39+
};
40+
// 如果到最后只剩一个合并内容,就直接返回这个合并值
41+
if (ans.length === 0) {
42+
return [last];
43+
}
44+
45+
return ans;
46+
47+
};
48+
// @lc code=end

leetcode/78.subsets.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* @lc app=leetcode id=78 lang=javascript
3+
*
4+
* [78] Subsets
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* 回溯算法
10+
* 获取所有子集的通用写法
11+
* 时间复杂度:O(n * 2 ^ n)。一共 2^n个状态,每种状态需要 O(n)O(n) 的时间来构造子集。
12+
* 空间复杂度:O(n)。临时数组 list 的空间代价是 O(n),递归时栈空间的代价为 O(n)。
13+
* @param {number[]} nums
14+
* @return {number[][]}
15+
*/
16+
var subsets = function(nums) {
17+
let list = [];
18+
let ans = [];
19+
20+
/**
21+
* 获取所有子集的通用递归写法
22+
* @param {*} depth 当前层级
23+
* @param {*} nums 总长度
24+
* @returns
25+
*/
26+
function dfs(depth, nums) {
27+
if (depth === nums.length) {
28+
ans.push(list.slice());
29+
return;
30+
}
31+
list.push(nums[depth]);
32+
dfs(depth + 1, nums);
33+
list.pop();
34+
dfs(depth + 1, nums);
35+
}
36+
37+
dfs(0, nums);
38+
39+
return ans;
40+
};
41+
// @lc code=end

0 commit comments

Comments
 (0)