Skip to content

Commit f923b73

Browse files
Merge branch 'master' of github.com:youngyangyang04/leetcode-master
2 parents 5a848b7 + 81f42ec commit f923b73

6 files changed

+199
-29
lines changed

problems/0070.爬楼梯.md

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -256,16 +256,28 @@ public int climbStairs(int n) {
256256
### Python
257257

258258
```python
259+
# 空间复杂度为O(n)版本
259260
class Solution:
260261
def climbStairs(self, n: int) -> int:
261-
# dp[i]表示爬到第i级楼梯的种数, (1, 2) (2, 1)是两种不同的类型
262-
dp = [0] * (n + 1)
263-
dp[0] = 1
264-
for i in range(n+1):
265-
for j in range(1, 3):
266-
if i>=j:
267-
dp[i] += dp[i-j]
268-
return dp[-1]
262+
# dp[i] 为第 i 阶楼梯有多少种方法爬到楼顶
263+
dp=[0]*(n+1)
264+
dp[0]=1
265+
dp[1]=1
266+
for i in range(2,n+1):
267+
dp[i]=dp[i-1]+dp[i-2]
268+
return dp[n]
269+
270+
# 空间复杂度为O(1)版本
271+
class Solution:
272+
def climbStairs(self, n: int) -> int:
273+
dp=[0]*(n+1)
274+
dp[0]=1
275+
dp[1]=1
276+
for i in range(2,n+1):
277+
tmp=dp[0]+dp[1]
278+
dp[0]=dp[1]
279+
dp[1]=tmp
280+
return dp[1]
269281
```
270282

271283
### Go

problems/0106.从中序与后序遍历序列构造二叉树.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,114 @@ var buildTree = function(preorder, inorder) {
814814
};
815815
```
816816

817+
## TypeScript
818+
819+
> 106.从中序与后序遍历序列构造二叉树
820+
821+
**创建新数组:**
822+
823+
```typescript
824+
function buildTree(inorder: number[], postorder: number[]): TreeNode | null {
825+
if (postorder.length === 0) return null;
826+
const rootVal: number = postorder.pop()!;
827+
const rootValIndex: number = inorder.indexOf(rootVal);
828+
const rootNode: TreeNode = new TreeNode(rootVal);
829+
rootNode.left = buildTree(inorder.slice(0, rootValIndex), postorder.slice(0, rootValIndex));
830+
rootNode.right = buildTree(inorder.slice(rootValIndex + 1), postorder.slice(rootValIndex));
831+
return rootNode;
832+
};
833+
```
834+
835+
**使用数组索引:**
836+
837+
```typescript
838+
function buildTree(inorder: number[], postorder: number[]): TreeNode | null {
839+
function recur(
840+
inorder: number[], postorder: number[],
841+
inBegin: number, inEnd: number,
842+
postBegin: number, postEnd: number
843+
): TreeNode | null {
844+
if (postBegin === postEnd) return null;
845+
const rootVal: number = postorder[postEnd - 1]!;
846+
const rootValIndex: number = inorder.indexOf(rootVal, inBegin);
847+
const rootNode: TreeNode = new TreeNode(rootVal);
848+
849+
const leftInorderBegin: number = inBegin;
850+
const leftInorderEnd: number = rootValIndex;
851+
const rightInorderBegin: number = rootValIndex + 1;
852+
const rightInorderEnd: number = inEnd;
853+
854+
const leftPostorderBegin: number = postBegin;
855+
const leftPostorderEnd: number = postBegin + rootValIndex - inBegin;
856+
const rightPostorderBegin: number = leftPostorderEnd;
857+
const rightPostorderEnd: number = postEnd - 1;
858+
859+
rootNode.left = recur(
860+
inorder, postorder,
861+
leftInorderBegin, leftInorderEnd,
862+
leftPostorderBegin, leftPostorderEnd
863+
);
864+
rootNode.right = recur(
865+
inorder, postorder,
866+
rightInorderBegin, rightInorderEnd,
867+
rightPostorderBegin, rightPostorderEnd
868+
);
869+
return rootNode;
870+
}
871+
return recur(inorder, postorder, 0, inorder.length, 0, inorder.length);
872+
};
873+
```
874+
875+
> 105.从前序与中序遍历序列构造二叉树
876+
877+
**新建数组:**
878+
879+
```typescript
880+
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
881+
if (preorder.length === 0) return null;
882+
const rootVal: number = preorder[0];
883+
const rootNode: TreeNode = new TreeNode(rootVal);
884+
const rootValIndex: number = inorder.indexOf(rootVal);
885+
rootNode.left = buildTree(preorder.slice(1, rootValIndex + 1), inorder.slice(0, rootValIndex));
886+
rootNode.right = buildTree(preorder.slice(rootValIndex + 1), inorder.slice(rootValIndex + 1));
887+
return rootNode;
888+
};
889+
```
890+
891+
**使用数组索引:**
892+
893+
```typescript
894+
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
895+
function recur(
896+
preorder: number[], inorder: number[],
897+
preBegin: number, preEnd: number,
898+
inBegin: number, inEnd: number
899+
): TreeNode | null {
900+
if (preBegin === preEnd) return null;
901+
const rootVal: number = preorder[preBegin];
902+
const rootNode: TreeNode = new TreeNode(rootVal);
903+
const rootValIndex: number = inorder.indexOf(rootVal, inBegin);
904+
905+
const leftPreBegin: number = preBegin + 1;
906+
const leftPreEnd: number = preBegin + rootValIndex - inBegin + 1;
907+
const leftInBegin: number = inBegin;
908+
const leftInEnd: number = rootValIndex;
909+
910+
const rightPreBegin: number = leftPreEnd;
911+
const rightPreEnd: number = preEnd;
912+
const rightInBegin: number = rootValIndex + 1;
913+
const rightInEnd: number = inEnd;
914+
915+
rootNode.left = recur(preorder, inorder, leftPreBegin, leftPreEnd, leftInBegin, leftInEnd);
916+
rootNode.right = recur(preorder, inorder, rightPreBegin, rightPreEnd, rightInBegin, rightInEnd);
917+
return rootNode;
918+
};
919+
return recur(preorder, inorder, 0, preorder.length, 0, inorder.length);
920+
};
921+
```
922+
817923
## C
924+
818925
106 从中序与后序遍历序列构造二叉树
819926

820927
```c

problems/0213.打家劫舍II.md

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -123,22 +123,24 @@ Python:
123123
```Python
124124
class Solution:
125125
def rob(self, nums: List[int]) -> int:
126-
if (n := len(nums)) == 0:
127-
return 0
128-
if n == 1:
129-
return nums[0]
130-
result1 = self.robRange(nums, 0, n - 2)
131-
result2 = self.robRange(nums, 1, n - 1)
132-
return max(result1 , result2)
133-
134-
def robRange(self, nums: List[int], start: int, end: int) -> int:
135-
if end == start: return nums[start]
136-
dp = [0] * len(nums)
137-
dp[start] = nums[start]
138-
dp[start + 1] = max(nums[start], nums[start + 1])
139-
for i in range(start + 2, end + 1):
140-
dp[i] = max(dp[i -2] + nums[i], dp[i - 1])
141-
return dp[end]
126+
#在198入门级的打家劫舍问题上分两种情况考虑
127+
#一是不偷第一间房,二是不偷最后一间房
128+
if len(nums)==1:#题目中提示nums.length>=1,所以不需要考虑len(nums)==0的情况
129+
return nums[0]
130+
val1=self.roblist(nums[1:])#不偷第一间房
131+
val2=self.roblist(nums[:-1])#不偷最后一间房
132+
return max(val1,val2)
133+
134+
def robRange(self,nums):
135+
l=len(nums)
136+
dp=[0]*l
137+
dp[0]=nums[0]
138+
for i in range(1,l):
139+
if i==1:
140+
dp[i]=max(dp[i-1],nums[i])
141+
else:
142+
dp[i]=max(dp[i-1],dp[i-2]+nums[i])
143+
return dp[-1]
142144
```
143145

144146
javascipt:

problems/0654.最大二叉树.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,56 @@ var constructMaximumBinaryTree = function (nums) {
371371
};
372372
```
373373

374+
## TypeScript
375+
376+
> 新建数组法:
377+
378+
```typescript
379+
function constructMaximumBinaryTree(nums: number[]): TreeNode | null {
380+
if (nums.length === 0) return null;
381+
let maxIndex: number = 0;
382+
let maxVal: number = nums[0];
383+
for (let i = 1, length = nums.length; i < length; i++) {
384+
if (nums[i] > maxVal) {
385+
maxIndex = i;
386+
maxVal = nums[i];
387+
}
388+
}
389+
const rootNode: TreeNode = new TreeNode(maxVal);
390+
rootNode.left = constructMaximumBinaryTree(nums.slice(0, maxIndex));
391+
rootNode.right = constructMaximumBinaryTree(nums.slice(maxIndex + 1));
392+
return rootNode;
393+
};
394+
```
395+
396+
> 使用数组索引法:
397+
398+
```typescript
399+
function constructMaximumBinaryTree(nums: number[]): TreeNode | null {
400+
// 左闭右开区间[begin, end)
401+
function recur(nums: number[], begin: number, end: number): TreeNode | null {
402+
if (begin === end) return null;
403+
let maxIndex: number = begin;
404+
let maxVal: number = nums[begin];
405+
for (let i = begin + 1; i < end; i++) {
406+
if (nums[i] > maxVal) {
407+
maxIndex = i;
408+
maxVal = nums[i];
409+
}
410+
}
411+
const rootNode: TreeNode = new TreeNode(maxVal);
412+
rootNode.left = recur(nums, begin, maxIndex);
413+
rootNode.right = recur(nums, maxIndex + 1, end);
414+
return rootNode;
415+
}
416+
return recur(nums, 0, nums.length);
417+
};
418+
```
419+
420+
421+
374422
## C
423+
375424
```c
376425
struct TreeNode* traversal(int* nums, int left, int right) {
377426
//若左边界大于右边界,返回NULL

problems/背包理论基础01背包-1.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ int main() {
271271
### java
272272

273273
```java
274-
public static void main(string[] args) {
274+
public static void main(String[] args) {
275275
int[] weight = {1, 3, 4};
276276
int[] value = {15, 20, 30};
277277
int bagsize = 4;
@@ -292,16 +292,16 @@ int main() {
292292
if (j < weight[i - 1]){
293293
dp[i][j] = dp[i - 1][j];
294294
}else{
295-
dp[i][j] = math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]);
295+
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]);
296296
}
297297
}
298298
}
299299
//打印dp数组
300300
for (int i = 0; i <= wlen; i++){
301301
for (int j = 0; j <= bagsize; j++){
302-
system.out.print(dp[i][j] + " ");
302+
System.out.print(dp[i][j] + " ");
303303
}
304-
system.out.print("\n");
304+
System.out.print("\n");
305305
}
306306
}
307307
```

problems/背包问题理论基础完全背包.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ dp状态图如下:
9494

9595
看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。
9696

97-
先遍历被背包在遍历物品,代码如下:
97+
先遍历背包在遍历物品,代码如下:
9898

9999
```CPP
100100
// 先遍历背包,再遍历物品

0 commit comments

Comments
 (0)