Skip to content

Commit 3637d4b

Browse files
authored
feat: add solutions to lc problem: No.3660 (#4663)
No.3660.Jump Game IX
1 parent c49b62c commit 3637d4b

File tree

7 files changed

+271
-8
lines changed

7 files changed

+271
-8
lines changed

solution/3600-3699/3660.Jump Game IX/README.md

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,32 +84,124 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3600-3699/3660.Ju
8484

8585
<!-- solution:start -->
8686

87-
### 方法一
87+
### 方法一:动态规划
88+
89+
如果 $i = n - 1$,那么它可以跳到 $\textit{nums}$ 中的最大值,因此 $\textit{ans}[i] = \max(\textit{nums})$。对于其他位置 $i$,我们可以通过维护一个前缀最大值数组和一个后缀最小值变量来计算。
90+
91+
具体步骤如下:
92+
93+
1. 创建一个数组 $\textit{preMax}$,其中 $\textit{preMax}[i]$ 表示从左到右遍历时 $[0, i]$ 区间内的最大值。
94+
2. 创建一个变量 $\textit{sufMin}$,表示从右到左遍历时,当前元素右侧的最小值。初始时 $\textit{sufMin} = \infty$。
95+
3. 首先预处理 $\textit{preMax}$ 数组。
96+
4. 接下来,从右到左遍历数组,对于每个位置 $i$,如果 $\textit{preMax}[i] > \textit{sufMin}$,说明可以从 $i$ 跳到 $\textit{preMax}$ 所在的位置,再跳到 $\textit{sufMin}$ 所在的位置,最后跳到 $i + 1$。因此在 $i + 1$ 能跳到的数,在 $i$ 也能跳到,因此 $\textit{ans}[i] = \textit{ans}[i + 1]$;否则更新为 $\textit{preMax}[i]$。然后更新 $\textit{sufMin}$。
97+
5. 最后返回结果数组 $\textit{ans}$。
98+
99+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 $\textit{nums}$ 的长度。
88100

89101
<!-- tabs:start -->
90102

91103
#### Python3
92104

93105
```python
94-
106+
class Solution:
107+
def maxValue(self, nums: List[int]) -> List[int]:
108+
n = len(nums)
109+
ans = [0] * n
110+
pre_max = [nums[0]] * n
111+
for i in range(1, n):
112+
pre_max[i] = max(pre_max[i - 1], nums[i])
113+
suf_min = inf
114+
for i in range(n - 1, -1, -1):
115+
ans[i] = ans[i + 1] if pre_max[i] > suf_min else pre_max[i]
116+
suf_min = min(suf_min, nums[i])
117+
return ans
95118
```
96119

97120
#### Java
98121

99122
```java
100-
123+
class Solution {
124+
public int[] maxValue(int[] nums) {
125+
int n = nums.length;
126+
int[] ans = new int[n];
127+
int[] preMax = new int[n];
128+
preMax[0] = nums[0];
129+
for (int i = 1; i < n; ++i) {
130+
preMax[i] = Math.max(preMax[i - 1], nums[i]);
131+
}
132+
int sufMin = 1 << 30;
133+
for (int i = n - 1; i >= 0; --i) {
134+
ans[i] = preMax[i] > sufMin ? ans[i + 1] : preMax[i];
135+
sufMin = Math.min(sufMin, nums[i]);
136+
}
137+
return ans;
138+
}
139+
}
101140
```
102141

103142
#### C++
104143

105144
```cpp
106-
145+
class Solution {
146+
public:
147+
vector<int> maxValue(vector<int>& nums) {
148+
int n = nums.size();
149+
vector<int> ans(n);
150+
vector<int> preMax(n, nums[0]);
151+
for (int i = 1; i < n; ++i) {
152+
preMax[i] = max(preMax[i - 1], nums[i]);
153+
}
154+
int sufMin = 1 << 30;
155+
for (int i = n - 1; i >= 0; --i) {
156+
ans[i] = preMax[i] > sufMin ? ans[i + 1] : preMax[i];
157+
sufMin = min(sufMin, nums[i]);
158+
}
159+
return ans;
160+
}
161+
};
107162
```
108163
109164
#### Go
110165
111166
```go
167+
func maxValue(nums []int) []int {
168+
n := len(nums)
169+
ans := make([]int, n)
170+
preMax := make([]int, n)
171+
preMax[0] = nums[0]
172+
for i := 1; i < n; i++ {
173+
preMax[i] = max(preMax[i-1], nums[i])
174+
}
175+
sufMin := 1 << 30
176+
for i := n - 1; i >= 0; i-- {
177+
if preMax[i] > sufMin {
178+
ans[i] = ans[i+1]
179+
} else {
180+
ans[i] = preMax[i]
181+
}
182+
sufMin = min(sufMin, nums[i])
183+
}
184+
return ans
185+
}
186+
```
112187

188+
#### TypeScript
189+
190+
```ts
191+
function maxValue(nums: number[]): number[] {
192+
const n = nums.length;
193+
const ans = Array(n).fill(0);
194+
const preMax = Array(n).fill(nums[0]);
195+
for (let i = 1; i < n; i++) {
196+
preMax[i] = Math.max(preMax[i - 1], nums[i]);
197+
}
198+
let sufMin = 1 << 30;
199+
for (let i = n - 1; i >= 0; i--) {
200+
ans[i] = preMax[i] > sufMin ? ans[i + 1] : preMax[i];
201+
sufMin = Math.min(sufMin, nums[i]);
202+
}
203+
return ans;
204+
}
113205
```
114206

115207
<!-- tabs:end -->

solution/3600-3699/3660.Jump Game IX/README_EN.md

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,32 +82,124 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3600-3699/3660.Ju
8282

8383
<!-- solution:start -->
8484

85-
### Solution 1
85+
### Solution 1: Dynamic Programming
86+
87+
If $i = n - 1$, then it can jump to the maximum value in $\textit{nums}$, so $\textit{ans}[i] = \max(\textit{nums})$. For other positions $i$, we can calculate by maintaining a prefix maximum array and a suffix minimum variable.
88+
89+
The specific steps are as follows:
90+
91+
1. Create an array $\textit{preMax}$, where $\textit{preMax}[i]$ represents the maximum value in the interval $[0, i]$ when traversing from left to right.
92+
2. Create a variable $\textit{sufMin}$, which represents the minimum value to the right of the current element when traversing from right to left. Initially $\textit{sufMin} = \infty$.
93+
3. First preprocess the $\textit{preMax}$ array.
94+
4. Next, traverse the array from right to left. For each position $i$, if $\textit{preMax}[i] > \textit{sufMin}$, it means we can jump from $i$ to the position where $\textit{preMax}$ is located, then jump to the position where $\textit{sufMin}$ is located, and finally jump to $i + 1$. Therefore, the numbers that can be reached from $i + 1$ can also be reached from $i$, so $\textit{ans}[i] = \textit{ans}[i + 1]$; otherwise update to $\textit{preMax}[i]$. Then update $\textit{sufMin}$.
95+
5. Finally return the result array $\textit{ans}$.
96+
97+
Time complexity $O(n)$, space complexity $O(n)$. Where $n$ is the length of the array $\textit{nums}$.
8698

8799
<!-- tabs:start -->
88100

89101
#### Python3
90102

91103
```python
92-
104+
class Solution:
105+
def maxValue(self, nums: List[int]) -> List[int]:
106+
n = len(nums)
107+
ans = [0] * n
108+
pre_max = [nums[0]] * n
109+
for i in range(1, n):
110+
pre_max[i] = max(pre_max[i - 1], nums[i])
111+
suf_min = inf
112+
for i in range(n - 1, -1, -1):
113+
ans[i] = ans[i + 1] if pre_max[i] > suf_min else pre_max[i]
114+
suf_min = min(suf_min, nums[i])
115+
return ans
93116
```
94117

95118
#### Java
96119

97120
```java
98-
121+
class Solution {
122+
public int[] maxValue(int[] nums) {
123+
int n = nums.length;
124+
int[] ans = new int[n];
125+
int[] preMax = new int[n];
126+
preMax[0] = nums[0];
127+
for (int i = 1; i < n; ++i) {
128+
preMax[i] = Math.max(preMax[i - 1], nums[i]);
129+
}
130+
int sufMin = 1 << 30;
131+
for (int i = n - 1; i >= 0; --i) {
132+
ans[i] = preMax[i] > sufMin ? ans[i + 1] : preMax[i];
133+
sufMin = Math.min(sufMin, nums[i]);
134+
}
135+
return ans;
136+
}
137+
}
99138
```
100139

101140
#### C++
102141

103142
```cpp
104-
143+
class Solution {
144+
public:
145+
vector<int> maxValue(vector<int>& nums) {
146+
int n = nums.size();
147+
vector<int> ans(n);
148+
vector<int> preMax(n, nums[0]);
149+
for (int i = 1; i < n; ++i) {
150+
preMax[i] = max(preMax[i - 1], nums[i]);
151+
}
152+
int sufMin = 1 << 30;
153+
for (int i = n - 1; i >= 0; --i) {
154+
ans[i] = preMax[i] > sufMin ? ans[i + 1] : preMax[i];
155+
sufMin = min(sufMin, nums[i]);
156+
}
157+
return ans;
158+
}
159+
};
105160
```
106161
107162
#### Go
108163
109164
```go
165+
func maxValue(nums []int) []int {
166+
n := len(nums)
167+
ans := make([]int, n)
168+
preMax := make([]int, n)
169+
preMax[0] = nums[0]
170+
for i := 1; i < n; i++ {
171+
preMax[i] = max(preMax[i-1], nums[i])
172+
}
173+
sufMin := 1 << 30
174+
for i := n - 1; i >= 0; i-- {
175+
if preMax[i] > sufMin {
176+
ans[i] = ans[i+1]
177+
} else {
178+
ans[i] = preMax[i]
179+
}
180+
sufMin = min(sufMin, nums[i])
181+
}
182+
return ans
183+
}
184+
```
110185

186+
#### TypeScript
187+
188+
```ts
189+
function maxValue(nums: number[]): number[] {
190+
const n = nums.length;
191+
const ans = Array(n).fill(0);
192+
const preMax = Array(n).fill(nums[0]);
193+
for (let i = 1; i < n; i++) {
194+
preMax[i] = Math.max(preMax[i - 1], nums[i]);
195+
}
196+
let sufMin = 1 << 30;
197+
for (let i = n - 1; i >= 0; i--) {
198+
ans[i] = preMax[i] > sufMin ? ans[i + 1] : preMax[i];
199+
sufMin = Math.min(sufMin, nums[i]);
200+
}
201+
return ans;
202+
}
111203
```
112204

113205
<!-- tabs:end -->
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
vector<int> maxValue(vector<int>& nums) {
4+
int n = nums.size();
5+
vector<int> ans(n);
6+
vector<int> preMax(n, nums[0]);
7+
for (int i = 1; i < n; ++i) {
8+
preMax[i] = max(preMax[i - 1], nums[i]);
9+
}
10+
int sufMin = 1 << 30;
11+
for (int i = n - 1; i >= 0; --i) {
12+
ans[i] = preMax[i] > sufMin ? ans[i + 1] : preMax[i];
13+
sufMin = min(sufMin, nums[i]);
14+
}
15+
return ans;
16+
}
17+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
func maxValue(nums []int) []int {
2+
n := len(nums)
3+
ans := make([]int, n)
4+
preMax := make([]int, n)
5+
preMax[0] = nums[0]
6+
for i := 1; i < n; i++ {
7+
preMax[i] = max(preMax[i-1], nums[i])
8+
}
9+
sufMin := 1 << 30
10+
for i := n - 1; i >= 0; i-- {
11+
if preMax[i] > sufMin {
12+
ans[i] = ans[i+1]
13+
} else {
14+
ans[i] = preMax[i]
15+
}
16+
sufMin = min(sufMin, nums[i])
17+
}
18+
return ans
19+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public int[] maxValue(int[] nums) {
3+
int n = nums.length;
4+
int[] ans = new int[n];
5+
int[] preMax = new int[n];
6+
preMax[0] = nums[0];
7+
for (int i = 1; i < n; ++i) {
8+
preMax[i] = Math.max(preMax[i - 1], nums[i]);
9+
}
10+
int sufMin = 1 << 30;
11+
for (int i = n - 1; i >= 0; --i) {
12+
ans[i] = preMax[i] > sufMin ? ans[i + 1] : preMax[i];
13+
sufMin = Math.min(sufMin, nums[i]);
14+
}
15+
return ans;
16+
}
17+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def maxValue(self, nums: List[int]) -> List[int]:
3+
n = len(nums)
4+
ans = [0] * n
5+
pre_max = [nums[0]] * n
6+
for i in range(1, n):
7+
pre_max[i] = max(pre_max[i - 1], nums[i])
8+
suf_min = inf
9+
for i in range(n - 1, -1, -1):
10+
ans[i] = ans[i + 1] if pre_max[i] > suf_min else pre_max[i]
11+
suf_min = min(suf_min, nums[i])
12+
return ans
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
function maxValue(nums: number[]): number[] {
2+
const n = nums.length;
3+
const ans = Array(n).fill(0);
4+
const preMax = Array(n).fill(nums[0]);
5+
for (let i = 1; i < n; i++) {
6+
preMax[i] = Math.max(preMax[i - 1], nums[i]);
7+
}
8+
let sufMin = 1 << 30;
9+
for (let i = n - 1; i >= 0; i--) {
10+
ans[i] = preMax[i] > sufMin ? ans[i + 1] : preMax[i];
11+
sufMin = Math.min(sufMin, nums[i]);
12+
}
13+
return ans;
14+
}

0 commit comments

Comments
 (0)