Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit dfe3d56

Browse files
feat: update 7 leetcode
1 parent b57efc0 commit dfe3d56

8 files changed

+290
-0
lines changed

‎leetcode/169.majority-element.ts‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* @lc app=leetcode id=169 lang=typescript
3+
*
4+
* [169] Majority Element
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* @description: 哈希表的方式
10+
* 时间复杂度 O(n)
11+
* 空间复杂度 O(n)
12+
* @param {number[]} nums
13+
* @return {number}
14+
*/
15+
function majorityElement(nums: number[]): number {
16+
let hash = {};
17+
18+
for (const num of nums) {
19+
hash[num] = hash[num] || 0;
20+
hash[num]++;
21+
if (hash[num] > nums.length / 2) return num;
22+
}
23+
}
24+
25+
/**
26+
* @description: BM 算法的思路
27+
* 时间复杂度 O(n)
28+
* 空间复杂度 O(1)
29+
* @param {number[]} nums
30+
* @return {number}
31+
*/
32+
function majorityElement2(nums: number[]): number {
33+
let count = 0;
34+
let candi;
35+
for (const num of nums) {
36+
// 前面的字符抵消了
37+
if (count === 0) {
38+
candi = num;
39+
}
40+
41+
// 如果相同,就继续增加,如果不同则减少
42+
count += candi === num ? 1 : -1;
43+
}
44+
45+
return candi;
46+
}
47+
// @lc code=end
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* @lc app=leetcode id=416 lang=typescript
3+
*
4+
* [416] Partition Equal Subset Sum
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* @description: 0-1 背包的扩展,这里用回溯实现;但实际更推荐使用动态规划
10+
* @param {number[]} nums
11+
* @return {boolean}
12+
*/
13+
function canPartition(nums: number[]): boolean {
14+
const sum = nums.reduce((pre, cur) => pre + cur, 0);
15+
const half = sum / 2;
16+
// 说明总和是奇数,取一半有小数点,也就不存在子数组和相等的可能
17+
if (half !== Math.floor(half)) return false;
18+
19+
let hasPartied = false;
20+
let memory = new Array(nums.length).fill(null).map(() => ({}));
21+
22+
/**
23+
* @description: 回溯解法
24+
* @param {number[]} arr
25+
* @param {number} index
26+
* @param {number} currentSum
27+
* @return {void}
28+
*/
29+
function backtrack(arr: number[], index: number, currentSum: number): void {
30+
if (index === arr.length) {
31+
// 判断如果能得到总和为一半的数组的情况,那么就是存在相等和的子数组
32+
if (currentSum === half) hasPartied = true;
33+
return;
34+
}
35+
// !使用缓存降低时间复杂度,提高效率
36+
if (memory[index][currentSum]) return;
37+
memory[index][currentSum] = true;
38+
backtrack(arr, index + 1, currentSum);
39+
if (currentSum + nums[index] <= half) {
40+
backtrack(arr, index + 1, currentSum + nums[index]);
41+
}
42+
}
43+
44+
backtrack(nums, 0, 0);
45+
46+
return hasPartied;
47+
}
48+
// @lc code=end

‎leetcode/494.target-sum.ts‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* @lc app=leetcode id=494 lang=typescript
3+
*
4+
* [494] Target Sum
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* @description: 回溯的解法,也可以使用动态规划
10+
* @param {number} nums
11+
* @param {number} target
12+
* @return {number}
13+
*/
14+
function findTargetSumWays(nums: number[], target: number): number {
15+
let count = 0;
16+
/**
17+
* @description: 定义回溯函数
18+
* @param {number[]} arr
19+
* @param {number} target
20+
* @param {number} index
21+
* @param {number} currentSum
22+
* @return {void}
23+
*/
24+
function backtrack(arr: number[], target: number, index: number, currentSum: number): void {
25+
if (index === arr.length) {
26+
currentSum === target && count++;
27+
return;
28+
}
29+
backtrack(arr, target, index + 1, currentSum + arr[index]);
30+
backtrack(arr, target, index + 1, currentSum - arr[index]);
31+
}
32+
backtrack(nums, target, 0, 0);
33+
return count;
34+
}
35+
// @lc code=end

‎leetcode/509.fibonacci-number.ts‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* @lc app=leetcode id=509 lang=typescript
3+
*
4+
* [509] Fibonacci Number
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* @description: 动态规划
10+
* @param {number} n
11+
* @return {number}
12+
*/
13+
function fib(n: number): number {
14+
const res = [];
15+
res[0] = 0;
16+
res[1] = 1;
17+
18+
for (let i = 2; i <= n; i++) {
19+
// !核心的递推公式
20+
res[i] = res[i - 1] + res[i - 2];
21+
}
22+
23+
return res[n];
24+
}
25+
// @lc code=end
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* @lc app=leetcode id=674 lang=typescript
3+
*
4+
* [674] Longest Continuous Increasing Subsequence
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* @description: 贪心算法
10+
* 时间复杂度 O(n)
11+
* 空间复杂度 O(1)
12+
* @param {number} nums
13+
* @return {numer}
14+
*/
15+
function findLengthOfLCIS(nums: number[]): number {
16+
let max = 1;
17+
let current = 1;
18+
for (let i = 1; i < nums.length; i++) {
19+
if (nums[i - 1] < nums[i]) {
20+
current += 1;
21+
max = Math.max(max, current);
22+
} else {
23+
current = 1;
24+
}
25+
}
26+
27+
return max;
28+
}
29+
// @lc code=end

‎leetcode/70.climbing-stairs.js‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,30 @@ let fibonacci = (function () {
8484
return memory[n] = n === 1 || n === 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
8585
}
8686
})();
87+
88+
/**
89+
* 进阶版,翻译
90+
* @param {*} num
91+
* @returns
92+
*/
93+
function num2str(num) {
94+
const numStr = num + ''
95+
96+
let first = 1
97+
let second = 0
98+
if ([1, 2].includes(numStr[0]) && numStr[i] < 6) {
99+
second = 2
100+
} else {
101+
second = 1
102+
}
103+
104+
for (let i = 1; i < numStr.length; i++) {
105+
if ([1, 2].includes(+numStr[i - 1]) && +numStr[i] < 6) {
106+
let middle = second
107+
second = first + second
108+
first = middle
109+
}
110+
}
111+
112+
return second
113+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* @lc app=leetcode id=728 lang=typescript
3+
*
4+
* [728] Self Dividing Numbers
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* @description: 判断每一位是否可以被除
10+
* @param {number} left
11+
* @param {number} right
12+
* @return {number[]}
13+
*/
14+
function selfDividingNumbers(left: number, right: number): number[] {
15+
let start = left;
16+
const res = [];
17+
18+
while (start <= right) {
19+
if (start < 10) {
20+
res.push(start);
21+
start++;
22+
continue;
23+
}
24+
let isDivided = true;
25+
for (const str of String(start)) {
26+
if (start % Number(str) !== 0) {
27+
isDivided = false;
28+
continue;
29+
}
30+
}
31+
isDivided && res.push(start);
32+
start++;
33+
}
34+
35+
return res;
36+
}
37+
// @lc code=end

‎leetcode/77.combinations.ts‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* @lc app=leetcode id=77 lang=typescript
3+
*
4+
* [77] Combinations
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* @description: 回溯算法的实践
10+
* @param {number} n
11+
* @param {number} k
12+
* @return {number[][]}
13+
*/
14+
function combine(n: number, k: number): number[][] {
15+
const res = []; // 保存结果的数组
16+
const currentList = []; // 每次组合的数组
17+
/**
18+
* @description: 递归函数用于计算保存
19+
* @param {number} n
20+
* @param {number} k
21+
* @param {number} startIndex
22+
* @return {void}
23+
*/
24+
function combineArr(n: number, k: number, startIndex: number): void {
25+
if (currentList.length === k) {
26+
// !注意避免引用类型的坑
27+
res.push(currentList.slice());
28+
return;
29+
}
30+
// !剪枝的方式提高效率,在判断当前数组内元素已经到达设定上限时不再继续执行
31+
for (let i = startIndex; i <= n - (k - currentList.length) + 1; i++) {
32+
// for (let i = startIndex; i <= n; i++) {
33+
currentList.push(i);
34+
combineArr(n, k, i + 1); // 下一个数字进行判断
35+
currentList.pop(); // 空出来用于进入下一轮判断
36+
}
37+
}
38+
39+
combineArr(n, k, 1);
40+
return res;
41+
}
42+
// @lc code=end

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /