Skip to content

Commit d35b1bf

Browse files
committed
📝 update alg lc
1 parent 621eea6 commit d35b1bf

7 files changed

Lines changed: 523 additions & 3 deletions

Java/alg/README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,9 @@
7474
- [543.二叉树的直径](lc/543.二叉树的直径.md)
7575
- [566.重塑矩阵](lc/566.重塑矩阵.md)
7676
- [572.另一个树的子树](lc/572.另一个树的子树.md)
77-
- [594.最长和谐子序列](lc/594.最长和谐子序列.md)
77+
- [594.最长和谐子序列](lc/594.最长和谐子序列.md)
78+
- [605.种花问题](lc/605.种花问题.md)
79+
- [617.合并二叉树](lc/617.合并二叉树.md)
80+
- [628.三个数的最大乘积](lc/628.三个数的最大乘积.md)
81+
- [637.二叉树的层平均值](lc/637.二叉树的层平均值.md)
82+
- [645.错误的集合](lc/645.错误的集合.md)

Java/alg/lc/594.最长和谐子序列.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# 594. 最长和谐子序列
22

33

4-
[url](https://leetcode-cn.com/problems/longest-harmonious-subsequence/)
4+
[url](https://leetcode-cn.com/problems/can-place-flowers/)
55

66

77
## 题目
@@ -22,7 +22,6 @@
2222
输入:nums = [1,1,1,1]
2323
输出:0
2424
```
25-
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
2625

2726
## 方法
2827

Java/alg/lc/605.种花问题.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# 605.种花问题
2+
3+
4+
[url](https://leetcode-cn.com/problems/longest-harmonious-subsequence/)
5+
6+
7+
## 题目
8+
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
9+
10+
给你一个整数数组  flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。
11+
12+
13+
14+
```
15+
输入:flowerbed = [1,0,0,0,1], n = 1
16+
输出:true
17+
输入:flowerbed = [1,0,0,0,1], n = 2
18+
输出:false
19+
```
20+
21+
22+
## 方法
23+
24+
25+
## code
26+
27+
### js
28+
29+
```js
30+
let canPlaceFlowers = (flowerbed, n) => {
31+
if (n < 0)
32+
return false;
33+
let cnt = 0;
34+
let len = flowerbed.length;
35+
for (let i = 0; i < len; i++) {
36+
if (flowerbed[i] === 1)
37+
continue;
38+
let pre = i === 0 ? 0 : flowerbed[i - 1];
39+
let next = i === len - 1 ? 0 : flowerbed[i + 1];
40+
if (pre === 0 && next === 0) {
41+
cnt++;
42+
flowerbed[i] = 1;
43+
}
44+
}
45+
return cnt >= n;
46+
};
47+
console.log(canPlaceFlowers([1,0,0,0,1], 1));
48+
console.log(canPlaceFlowers([1,0,0,0,1], 2));
49+
```
50+
51+
### go
52+
53+
```go
54+
func canPlaceFlower(flowerbed []int, n int) bool {
55+
if n < 0 {
56+
return false
57+
}
58+
cnt := 0
59+
l := len(flowerbed)
60+
for i := 0; i < l; i++ {
61+
if flowerbed[i] == 1{
62+
continue
63+
}
64+
pre, next := 0, 0
65+
if i == 0 {
66+
pre = 0
67+
} else {
68+
pre = flowerbed[i - 1]
69+
}
70+
if i == l - 1 {
71+
next = 0
72+
} else {
73+
next = flowerbed[i + 1]
74+
}
75+
if pre == 0 && next == 0 {
76+
cnt++
77+
flowerbed[i] = 1
78+
}
79+
}
80+
return cnt >= n
81+
}
82+
```
83+
84+
### java
85+
86+
```java
87+
class Solution {
88+
public boolean canPlaceFlowers(int[] flowerbed, int n) {
89+
// 边界?
90+
if (n < 0) return false;
91+
int cnt = 0;
92+
int len = flowerbed.length;
93+
for (int i = 0; i < len; i++) {
94+
// 判断是1的
95+
if (flowerbed[i] == 1) continue;
96+
int pre = i == 0 ? 0 : flowerbed[i - 1];
97+
int next = i == len - 1 ? 0 : flowerbed[i + 1];
98+
if (pre == 0 && next == 0) {
99+
cnt++;
100+
flowerbed[i] = 1;
101+
}
102+
}
103+
return cnt >= n;
104+
}
105+
}
106+
```
107+

Java/alg/lc/617.合并二叉树.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# 617. 合并二叉树
2+
3+
4+
[url](https://leetcode-cn.com/problems/merge-two-binary-trees/)
5+
6+
7+
## 题目
8+
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
9+
10+
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
11+
12+
```
13+
输入:
14+
Tree 1 Tree 2
15+
1 2
16+
/ \ / \
17+
3 2 1 3
18+
/ \ \
19+
5 4 7
20+
输出:
21+
合并后的树:
22+
3
23+
/ \
24+
4 5
25+
/ \ \
26+
5 4 7
27+
```
28+
29+
30+
## 方法
31+
32+
33+
## code
34+
35+
### js
36+
37+
```js
38+
let mergeTrees = (l1, l2) => {
39+
if (l1 === null && l2 === null)
40+
return null;
41+
if (l1 === null)
42+
return l2;
43+
if (l2 === null)
44+
return l1;
45+
let root = TreeNode(l1.val + l2.val);
46+
root.left = mergeTrees(l1.left, l2.left);
47+
root.right = mergeTrees(l1.right, l2.right);
48+
return root;
49+
};
50+
```
51+
52+
### go
53+
54+
```go
55+
func mergeTrees(t1 *TreeNode, t2 *TreeNode) *TreeNode {
56+
if t1 == nil && t2 == nil {
57+
return nil
58+
}
59+
if t1 == nil {
60+
return t2
61+
}
62+
if t2 == nil {
63+
return t1
64+
}
65+
root := &TreeNode{Val: t1.Val + t2.Val}
66+
root.Left = mergeTrees(t1.Left, t2.Left)
67+
root.Right = mergeTrees(t1.Right, t2.Right)
68+
return root
69+
}
70+
```
71+
72+
### java
73+
74+
```java
75+
class Solution {
76+
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
77+
if (t1 == null && t2 == null) return null;
78+
if (t1 == null) return t2;
79+
if (t2 == null) return t1;
80+
TreeNode root = new TreeNode(t1.val + t2.val);
81+
root.left = mergeTrees(t1.left, t2.left);
82+
root.right = mergeTrees(t1.right, t2.right);
83+
return root;
84+
}
85+
}
86+
```
87+
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
# 628. 三个数的最大乘积
2+
3+
4+
[url](https://leetcode-cn.com/problems/maximum-product-of-three-numbers/)
5+
6+
7+
## 题目
8+
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
9+
10+
11+
```
12+
输入:nums = [1,2,3]
13+
输出:6
14+
输入:nums = [1,2,3,4]
15+
输出:24
16+
输入:nums = [-1,-2,-3]
17+
输出:-6
18+
```
19+
20+
21+
## 方法
22+
23+
24+
## code
25+
26+
### js
27+
28+
```js
29+
let maximumProduct = nums => {
30+
let minValue = -Infinity;
31+
let max1 = minValue, max2 = minValue, max3 = minValue;
32+
let min1 = -minValue, min2 = -minValue;
33+
nums.forEach(n => {
34+
if (n > max1) {
35+
max3 = max2;
36+
max2 = max1;
37+
max1 = n;
38+
} else if (n > max2) {
39+
max3 = max2;
40+
max2 = n;
41+
} else if (n > max3) {
42+
max3 = n;
43+
}
44+
if (n < min1) {
45+
min2 = min1;
46+
min1 = n;
47+
} else if (n < min2) {
48+
min2 = n;
49+
}
50+
});
51+
return Math.max(max1 * max2 * max3, max1 * min1 * min2);
52+
};
53+
console.log(maximumProduct([1, 2, 3]));
54+
console.log(maximumProduct([1, 2, 3, 4]));
55+
```
56+
57+
### go
58+
59+
```go
60+
func maximumProduct(nums []int) int {
61+
INT_MAX := int(^uint((0)) >> 1)
62+
INT_MIN := ^INT_MAX
63+
max1, max2, max3 := INT_MIN, INT_MIN, INT_MIN
64+
min1, min2 := INT_MAX, INT_MAX
65+
for _, num := range nums {
66+
if num > max1 {
67+
max3 = max2
68+
max2 = max1
69+
max1 = num
70+
} else if num > max2 {
71+
max3 = max2
72+
max2 = num
73+
} else if num > max3 {
74+
max3 = num
75+
}
76+
if num < min1 {
77+
min2 = min1
78+
min1 = num
79+
} else if num < min2 {
80+
min2 = num
81+
}
82+
}
83+
return max4(max1 * max2 * max3, max1 * min1 * min2)
84+
}
85+
func max4(a int, b int) int {
86+
if a < b {
87+
return b
88+
} else {
89+
return a
90+
}
91+
}
92+
```
93+
94+
### java
95+
96+
```java
97+
class Solution {
98+
public int maximumProduct(int[] nums) {
99+
int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE,min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
100+
for (int n : nums) {
101+
if (n > max1) {
102+
max3 = max2;
103+
max2 = max1;
104+
max1 = n;
105+
} else if (n > max2) {
106+
max3 = max2;
107+
max2 = n;
108+
} else if (n > max3) {
109+
max3 = n;
110+
}
111+
if (n < min1) {
112+
min2 = min1;
113+
min1 = n;
114+
} else if (n < min2) {
115+
min2 = n;
116+
}
117+
}
118+
return Math.max(max1*max2*max3, max1*min1*min2);
119+
}
120+
}
121+
```
122+

0 commit comments

Comments
 (0)