Skip to content

Commit 57f9fa9

Browse files
authored
Merge pull request #251 from Don2025/master
Leetcode419
2 parents c4ef088 + 2e73dba commit 57f9fa9

File tree

6 files changed

+305
-0
lines changed

6 files changed

+305
-0
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package leetcode
2+
3+
func maxRotateFunction(nums []int) int {
4+
n := len(nums)
5+
var sum, f int
6+
for i, num := range nums {
7+
sum += num
8+
f += i * num // F(0)
9+
}
10+
ans := f
11+
for i := 1; i < n; i++ {
12+
f += sum - n*nums[n-i] // F(i) = F(i-1) + sum - n*nums[n-i]
13+
if f > ans {
14+
ans = f
15+
}
16+
}
17+
return ans
18+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question396 struct {
9+
para396
10+
ans396
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para396 struct {
16+
one []int
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans396 struct {
22+
one int
23+
}
24+
25+
func Test_Problem396(t *testing.T) {
26+
27+
qs := []question396{
28+
{
29+
para396{[]int{4, 3, 2, 6}},
30+
ans396{26},
31+
},
32+
33+
{
34+
para396{[]int{100}},
35+
ans396{0},
36+
},
37+
}
38+
39+
fmt.Printf("------------------------Leetcode Problem 396------------------------\n")
40+
41+
for _, q := range qs {
42+
_, p := q.ans396, q.para396
43+
fmt.Printf("【input】:%v 【output】:%v\n", p, maxRotateFunction(p.one))
44+
}
45+
fmt.Printf("\n\n\n")
46+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# [396. Rotate Function](https://leetcode.com/problems/rotate-function/)
2+
3+
## 题目
4+
5+
You are given an integer array `nums` of length `n`.
6+
7+
Assume `arrk` to be an array obtained by rotating `nums` by `k` positions clock-wise. We define the **rotation function** `F` on `nums` as follow:
8+
9+
- `F(k) = 0 * arrk[0] + 1 * arrk[1] + ... + (n - 1) * arrk[n - 1]`.
10+
11+
Return the maximum value of `F(0), F(1), ..., F(n-1)`.
12+
13+
The test cases are generated so that the answer fits in a **32-bit** integer.
14+
15+
**Example 1:**
16+
17+
```c
18+
Input: nums = [4,3,2,6]
19+
Output: 26
20+
Explanation:
21+
F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25
22+
F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16
23+
F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23
24+
F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + 12 = 26
25+
So the maximum value of F(0), F(1), F(2), F(3) is F(3) = 26.
26+
```
27+
28+
**Example 2:**
29+
30+
```c
31+
Input: nums = [100]
32+
Output: 0
33+
```
34+
35+
**Constraints:**
36+
37+
- `n == nums.length`
38+
- `1 <= n <= 105`
39+
- `-100 <= nums[i] <= 100`
40+
41+
## 题目大意
42+
43+
给定一个长度为`n`的整数数组`nums`,设`arrk`是数组`nums`顺时针旋转`k`个位置后的数组。
44+
45+
定义`nums`的旋转函数`F`为:
46+
47+
- `F(k) = 0 * arrk[0] + 1 * arrk[1] + ... + (n - 1) * arrk[n - 1]`
48+
49+
返回`F(0), F(1), ..., F(n-1)`中的最大值。
50+
51+
## 解题思路
52+
53+
**抽象化观察:**
54+
55+
```c
56+
nums = [A0, A1, A2, A3]
57+
58+
sum = A0 + A1 + A2+ A3
59+
F(0) = 0*A0 +0*A0 + 1*A1 + 2*A2 + 3*A3
60+
61+
F(1) = 0*A3 + 1*A0 + 2*A1 + 3*A2
62+
= F(0) + (A0 + A1 + A2) - 3*A3
63+
= F(0) + (sum-A3) - 3*A3
64+
= F(0) + sum - 4*A3
65+
66+
F(2) = 0*A2 + 1*A3 + 2*A0 + 3*A1
67+
= F(1) + A3 + A0 + A1 - 3*A2
68+
= F(1) + sum - 4*A2
69+
70+
F(3) = 0*A1 + 1*A2 + 2*A3 + 3*A0
71+
= F(2) + A2 + A3 + A0 - 3*A1
72+
= F(2) + sum - 4*A1
73+
74+
// 记sum为nums数组中所有元素和
75+
// 可以猜测当0 ≤ i < n时存在公式:
76+
F(i) = F(i-1) + sum - n * A(n-i)
77+
```
78+
79+
**数学归纳法证明迭代公式:**
80+
81+
根据题目中给定的旋转函数公式可得已知条件:
82+
83+
- `F(0) = 0×nums[0] + 1×nums[1] + ... + (n−1)×nums[n−1]`;
84+
85+
- `F(1) = 1×nums[0] + 2×nums[1] + ... + 0×nums[n-1]`。
86+
87+
令数组`nums`中所有元素和为`sum`,用数学归纳法验证:当`1 ≤ k < n`时,`F(k) = F(k-1) + sum - n×nums[n-k]`成立。
88+
89+
**归纳奠基**:证明`k=1`时命题成立。
90+
91+
```c
92+
F(1) = 1×nums[0] + 2×nums[1] + ... + 0×nums[n-1]
93+
= F(0) + sum - n×nums[n-1]
94+
```
95+
96+
**归纳假设**:假设`F(k) = F(k-1) + sum - n×nums[n-k]`成立。
97+
98+
**归纳递推**:由归纳假设推出`F(k+1) = F(k) + sum - n×nums[n-(k+1)]`成立,则假设的递推公式成立。
99+
100+
```c
101+
F(k+1) = (k+1)×nums[0] + k×nums[1] + ... + 0×nums[n-1]
102+
= F(k) + sum - n×nums[n-(k+1)]
103+
```
104+
105+
因此可以得到递推公式:
106+
107+
- 当`n = 0`时,`F(0) = 0×nums[0] + 1×nums[1] + ... + (n−1)×nums[n−1]`
108+
- 当`1 ≤ k < n`时,`F(k) = F(k-1) + sum - n×nums[n-k]`成立。
109+
110+
循环遍历`0 ≤ k < n`,计算出不同的`F(k)`并不断更新最大值,就能求出`F(0), F(1), ..., F(n-1)`中的最大值。
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package leetcode
2+
3+
func countBattleships(board [][]byte) (ans int) {
4+
if len(board) == 0 || len(board[0]) == 0 {
5+
return 0
6+
}
7+
for i := range board {
8+
for j := range board[i] {
9+
if board[i][j] == 'X' {
10+
if i > 0 && board[i-1][j] == 'X' {
11+
continue
12+
}
13+
if j > 0 && board[i][j-1] == 'X' {
14+
continue
15+
}
16+
ans++
17+
}
18+
}
19+
}
20+
return
21+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
"unsafe"
7+
)
8+
9+
type question419 struct {
10+
para419
11+
ans419
12+
}
13+
14+
// para 是参数
15+
// one 代表第一个参数
16+
type para419 struct {
17+
one [][]byte
18+
}
19+
20+
// ans 是答案
21+
// one 代表第一个答案
22+
type ans419 struct {
23+
one int
24+
}
25+
26+
func Test_Problem419(t *testing.T) {
27+
28+
qs := []question419{
29+
30+
{
31+
para419{[][]byte{{'X', '.', '.', 'X'}, {'.', '.', '.', 'X'}, {'.', '.', '.', 'X'}}},
32+
ans419{2},
33+
},
34+
35+
{
36+
para419{[][]byte{{'.'}}},
37+
ans419{0},
38+
},
39+
}
40+
41+
fmt.Printf("------------------------Leetcode Problem 419------------------------\n")
42+
43+
for _, q := range qs {
44+
_, p := q.ans419, q.para419
45+
fmt.Printf("【input】:%v 【output】:%v\n", bytesArrayToStringArray(p.one), countBattleships(p.one))
46+
}
47+
fmt.Printf("\n\n\n")
48+
49+
}
50+
51+
// 在运行go test时 为了更直观地显示[][]byte中的字符而非ASCII码数值
52+
// bytesArrayToStringArray converts [][]byte to []string
53+
func bytesArrayToStringArray(b [][]byte) []string {
54+
s := make([]string, len(b))
55+
for i := range b {
56+
s[i] = fmt.Sprintf("[%v]", *(*string)(unsafe.Pointer(&b[i])))
57+
}
58+
return s
59+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# [419. Battleships in a Board](https://leetcode.com/problems/battleships-in-a-board/)
2+
3+
## 题目
4+
5+
Given an `m x n` matrix `board` where each cell is a battleship `'X'` or empty `'.'`, return the number of the **battleships** on `board`.
6+
7+
**Battleships** can only be placed horizontally or vertically on `board`. In other words, they can only be made of the shape `1 x k` (`1` row, `k` columns) or `k x 1` (`k` rows, `1` column), where `k` can be of any size. At least one horizontal or vertical cell separates between two battleships (i.e., there are no adjacent battleships).
8+
9+
**Example 1:**
10+
11+
![img](https://assets.leetcode.com/uploads/2021/04/10/battelship-grid.jpg)
12+
13+
```c
14+
Input: board = [["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]]
15+
Output: 2
16+
```
17+
18+
**Example 2:**
19+
20+
```c
21+
Input: board = [["."]]
22+
Output: 0
23+
```
24+
25+
**Constraints:**
26+
27+
- `m == board.length`
28+
- `n == board[i].length`
29+
- `1 <= m, n <= 200`
30+
- `board[i][j] is either '.' or 'X'`.
31+
32+
**Follow up:** Could you do it in one-pass, using only `O(1)` extra memory and without modifying the values `board`?
33+
34+
## 题目大意
35+
36+
给定一个大小为`m × n`的矩阵 称之为甲板,矩阵单元格中的`'X'`表示战舰,`'.'`表示空位。
37+
38+
战舰只能水平或竖直摆放在甲板上(换句话说,可以理解为联通的同一行`'X'`或同一列`'X'`只算作一个“战舰群”),任意俩个“战舰群”间都是不相邻的。返回甲板上“战舰群”的数量。
39+
40+
## 解题思路
41+
42+
题目进阶要求一次扫描算法,空间复杂度为`O(1)`,且不能修改矩阵中的值。
43+
44+
因为题目中给定的两个“战舰群”间至少有一个水平或垂直的空位分隔,所以可以通过枚举每个战舰的左上顶点即可统计“战舰群”的个数。
45+
46+
假设当前遍历到矩阵中`'X'`的位置为`(i, j)`,即 `board[i][j]='X'`。如果当前战舰属于一个新的“战舰群”,则需要满足以下条件:
47+
48+
- 当前位置的上方位为空,即 `board[i-1][j]='.'`
49+
- 当前位置的左方位为空,即 `board[i][j-1]='.'`
50+
51+
统计出所有左方位和上方位为空的战舰个数,即可得到“战舰群”的数量。

0 commit comments

Comments
 (0)