Skip to content

Commit 5bc6e0b

Browse files
authored
Merge branch 'youngyangyang04:master' into zhicheng-lee-patch-8
2 parents e498df6 + 73d7e3f commit 5bc6e0b

File tree

4 files changed

+65
-21
lines changed

4 files changed

+65
-21
lines changed

problems/0337.打家劫舍III.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public:
191191
vector<int> left = robTree(cur->left);
192192
vector<int> right = robTree(cur->right);
193193
// 偷cur,那么就不能偷左右节点。
194-
int val1 = cur->val + left[1] + right[1];
194+
int val1 = cur->val + left[0] + right[0];
195195
// 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况
196196
int val2 = max(left[0], left[1]) + max(right[0], right[1]);
197197
return {val2, val1};

problems/0452.用最少数量的箭引爆气球.md

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -137,29 +137,21 @@ public:
137137
### Java
138138
```java
139139
/**
140-
时间复杂度 : O(NlogN) 排序需要 O(NlogN) 的复杂度
141-
142-
空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间
143-
*/
140+
* 时间复杂度 : O(NlogN) 排序需要 O(NlogN) 的复杂度
141+
* 空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间
142+
*/
144143
class Solution {
145144
public int findMinArrowShots(int[][] points) {
146-
if (points.length == 0) return 0;
147-
//用x[0] - y[0] 会大于2147483647 造成整型溢出
148-
Arrays.sort(points, (x, y) -> Integer.compare(x[0], y[0]));
149-
//count = 1 因为最少需要一个箭来射击第一个气球
150-
int count = 1;
151-
//重叠气球的最小右边界
152-
int leftmostRightBound = points[0][1];
145+
// 根据气球直径的开始坐标从小到大排序
146+
// 使用Integer内置比较方法,不会溢出
147+
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
148+
149+
int count = 1; // points 不为空至少需要一支箭
153150
for (int i = 1; i < points.length; i++) {
154-
//如果下一个气球的左边界大于最小右边界
155-
for(int i = 1; i < points.length; i++){
156-
if (points[i][0] > leftmostRightBound ) {
157-
//增加一次射击
158-
count++;
159-
leftmostRightBound = points[i][1];
160-
//不然就更新最小右边界
161-
} else {
162-
leftmostRightBound = Math.min(leftmostRightBound , points[i][1]);
151+
if (points[i][0] > points[i - 1][1]) { // 气球i和气球i-1不挨着,注意这里不是>=
152+
count++; // 需要一支箭
153+
} else { // 气球i和气球i-1挨着
154+
points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重叠气球最小右边界
163155
}
164156
}
165157
return count;

problems/0463.岛屿的周长.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,25 @@ class Solution:
179179
```
180180

181181
Go:
182+
```go
183+
func islandPerimeter(grid [][]int) int {
184+
m, n := len(grid), len(grid[0])
185+
res := 0
186+
for i := 0; i < m; i++ {
187+
for j := 0; j < n; j++ {
188+
if grid[i][j] == 1 {
189+
res += 4
190+
// 上下左右四个方向
191+
if i > 0 && grid[i-1][j] == 1 {res--} // 上边有岛屿
192+
if i < m-1 && grid[i+1][j] == 1 {res--} // 下边有岛屿
193+
if j > 0 && grid[i][j-1] == 1 {res--} // 左边有岛屿
194+
if j < n-1 && grid[i][j+1] == 1 {res--} // 右边有岛屿
195+
}
196+
}
197+
}
198+
return res
199+
}
200+
```
182201

183202
JavaScript:
184203
```javascript

problems/1356.根据数字二进制下1的数目排序.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,39 @@ class Solution:
170170
## Go
171171

172172
```go
173+
func sortByBits(arr []int) []int {
174+
var tmp int
175+
for i := 0; i < len(arr); i++ {
176+
for j := i+1; j < len(arr); j++ {
177+
// 冒泡排序的手法,但是排序的规则从比大小变成了比位运算1的个数
178+
if isCmp(arr[i], arr[j]) {
179+
tmp = arr[i]
180+
arr[i] = arr[j]
181+
arr[j] = tmp
182+
}
183+
}
184+
}
185+
return arr
186+
}
187+
188+
func isCmp(a, b int) bool {
189+
bitA := bitCount(a)
190+
bitB := bitCount(b)
191+
if bitA == bitB {
192+
return a > b
193+
} else {
194+
return bitA > bitB
195+
}
196+
}
197+
198+
func bitCount(n int) int {
199+
count := 0
200+
for n != 0 {
201+
n &= (n-1) // 清除最低位的1
202+
count++
203+
}
204+
return count
205+
}
173206
```
174207

175208
## JavaScript

0 commit comments

Comments
 (0)