Skip to content

Commit 2c93c60

Browse files
committed
feat: add solutions to lc problem: No.0915
No.0915.Partition Array into Disjoint Intervals
1 parent 894303a commit 2c93c60

File tree

6 files changed

+255
-17
lines changed

6 files changed

+255
-17
lines changed

solution/0900-0999/0915.Partition Array into Disjoint Intervals/README.md

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,116 @@
5050

5151
<!-- 这里可写通用的实现逻辑 -->
5252

53+
**方法一:前缀最大值 + 后缀最小值**
54+
55+
划分后的两个子数组要满足题目要求,需要保证“数组前缀最大值”小于等于“数组后缀最小值”。
56+
57+
因此,我们可以先预处理出数组的后缀最小值,记录在 `mi` 数组中。
58+
59+
然后从前往后遍历数组,维护数组前缀的最大值 `mx`,当遍历到某个位置时,如果数组前缀最大值小于等于数组后缀最小值,那么当前位置就是划分的分界点,直接返回即可。
60+
61+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 `nums` 的长度。
62+
5363
<!-- tabs:start -->
5464

5565
### **Python3**
5666

5767
<!-- 这里可写当前语言的特殊实现逻辑 -->
5868

5969
```python
60-
70+
class Solution:
71+
def partitionDisjoint(self, nums: List[int]) -> int:
72+
n = len(nums)
73+
mi = [inf] * (n + 1)
74+
for i in range(n - 1, -1, -1):
75+
mi[i] = min(nums[i], mi[i + 1])
76+
mx = 0
77+
for i, v in enumerate(nums, 1):
78+
mx = max(mx, v)
79+
if mx <= mi[i]:
80+
return i
6181
```
6282

6383
### **Java**
6484

6585
<!-- 这里可写当前语言的特殊实现逻辑 -->
6686

6787
```java
88+
class Solution {
89+
public int partitionDisjoint(int[] nums) {
90+
int n = nums.length;
91+
int[] mi = new int[n + 1];
92+
mi[n] = nums[n - 1];
93+
for (int i = n - 1; i >= 0; --i) {
94+
mi[i] = Math.min(nums[i], mi[i + 1]);
95+
}
96+
int mx = 0;
97+
for (int i = 1; i <= n; ++i) {
98+
int v = nums[i - 1];
99+
mx = Math.max(mx, v);
100+
if (mx <= mi[i]) {
101+
return i;
102+
}
103+
}
104+
return 0;
105+
}
106+
}
107+
```
108+
109+
### **C++**
110+
111+
```cpp
112+
class Solution {
113+
public:
114+
int partitionDisjoint(vector<int>& nums) {
115+
int n = nums.size();
116+
vector<int> mi(n + 1, INT_MAX);
117+
for (int i = n - 1; ~i; --i) mi[i] = min(nums[i], mi[i + 1]);
118+
int mx = 0;
119+
for (int i = 1; i <= n; ++i) {
120+
int v = nums[i - 1];
121+
mx = max(mx, v);
122+
if (mx <= mi[i]) return i;
123+
}
124+
return 0;
125+
}
126+
};
127+
```
68128
129+
### **Go**
130+
131+
```go
132+
func partitionDisjoint(nums []int) int {
133+
n := len(nums)
134+
mi := make([]int, n+1)
135+
mi[n] = nums[n-1]
136+
for i := n - 1; i >= 0; i-- {
137+
mi[i] = min(nums[i], mi[i+1])
138+
}
139+
mx := 0
140+
for i := 1; i <= n; i++ {
141+
v := nums[i-1]
142+
mx = max(mx, v)
143+
if mx <= mi[i] {
144+
return i
145+
}
146+
}
147+
return 0
148+
}
149+
150+
func max(a, b int) int {
151+
if a > b {
152+
return a
153+
}
154+
return b
155+
}
156+
157+
func min(a, b int) int {
158+
if a < b {
159+
return a
160+
}
161+
return b
162+
}
69163
```
70164

71165
### **...**

solution/0900-0999/0915.Partition Array into Disjoint Intervals/README_EN.md

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,97 @@
4949
### **Python3**
5050

5151
```python
52-
52+
class Solution:
53+
def partitionDisjoint(self, nums: List[int]) -> int:
54+
n = len(nums)
55+
mi = [inf] * (n + 1)
56+
for i in range(n - 1, -1, -1):
57+
mi[i] = min(nums[i], mi[i + 1])
58+
mx = 0
59+
for i, v in enumerate(nums, 1):
60+
mx = max(mx, v)
61+
if mx <= mi[i]:
62+
return i
5363
```
5464

5565
### **Java**
5666

5767
```java
68+
class Solution {
69+
public int partitionDisjoint(int[] nums) {
70+
int n = nums.length;
71+
int[] mi = new int[n + 1];
72+
mi[n] = nums[n - 1];
73+
for (int i = n - 1; i >= 0; --i) {
74+
mi[i] = Math.min(nums[i], mi[i + 1]);
75+
}
76+
int mx = 0;
77+
for (int i = 1; i <= n; ++i) {
78+
int v = nums[i - 1];
79+
mx = Math.max(mx, v);
80+
if (mx <= mi[i]) {
81+
return i;
82+
}
83+
}
84+
return 0;
85+
}
86+
}
87+
```
88+
89+
### **C++**
90+
91+
```cpp
92+
class Solution {
93+
public:
94+
int partitionDisjoint(vector<int>& nums) {
95+
int n = nums.size();
96+
vector<int> mi(n + 1, INT_MAX);
97+
for (int i = n - 1; ~i; --i) mi[i] = min(nums[i], mi[i + 1]);
98+
int mx = 0;
99+
for (int i = 1; i <= n; ++i) {
100+
int v = nums[i - 1];
101+
mx = max(mx, v);
102+
if (mx <= mi[i]) return i;
103+
}
104+
return 0;
105+
}
106+
};
107+
```
58108
109+
### **Go**
110+
111+
```go
112+
func partitionDisjoint(nums []int) int {
113+
n := len(nums)
114+
mi := make([]int, n+1)
115+
mi[n] = nums[n-1]
116+
for i := n - 1; i >= 0; i-- {
117+
mi[i] = min(nums[i], mi[i+1])
118+
}
119+
mx := 0
120+
for i := 1; i <= n; i++ {
121+
v := nums[i-1]
122+
mx = max(mx, v)
123+
if mx <= mi[i] {
124+
return i
125+
}
126+
}
127+
return 0
128+
}
129+
130+
func max(a, b int) int {
131+
if a > b {
132+
return a
133+
}
134+
return b
135+
}
136+
137+
func min(a, b int) int {
138+
if a < b {
139+
return a
140+
}
141+
return b
142+
}
59143
```
60144

61145
### **...**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
int partitionDisjoint(vector<int>& nums) {
4+
int n = nums.size();
5+
vector<int> mi(n + 1, INT_MAX);
6+
for (int i = n - 1; ~i; --i) mi[i] = min(nums[i], mi[i + 1]);
7+
int mx = 0;
8+
for (int i = 1; i <= n; ++i) {
9+
int v = nums[i - 1];
10+
mx = max(mx, v);
11+
if (mx <= mi[i]) return i;
12+
}
13+
return 0;
14+
}
15+
};
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
func partitionDisjoint(nums []int) int {
2+
n := len(nums)
3+
mi := make([]int, n+1)
4+
mi[n] = nums[n-1]
5+
for i := n - 1; i >= 0; i-- {
6+
mi[i] = min(nums[i], mi[i+1])
7+
}
8+
mx := 0
9+
for i := 1; i <= n; i++ {
10+
v := nums[i-1]
11+
mx = max(mx, v)
12+
if mx <= mi[i] {
13+
return i
14+
}
15+
}
16+
return 0
17+
}
18+
19+
func max(a, b int) int {
20+
if a > b {
21+
return a
22+
}
23+
return b
24+
}
25+
26+
func min(a, b int) int {
27+
if a < b {
28+
return a
29+
}
30+
return b
31+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public int partitionDisjoint(int[] nums) {
3+
int n = nums.length;
4+
int[] mi = new int[n + 1];
5+
mi[n] = nums[n - 1];
6+
for (int i = n - 1; i >= 0; --i) {
7+
mi[i] = Math.min(nums[i], mi[i + 1]);
8+
}
9+
int mx = 0;
10+
for (int i = 1; i <= n; ++i) {
11+
int v = nums[i - 1];
12+
mx = Math.max(mx, v);
13+
if (mx <= mi[i]) {
14+
return i;
15+
}
16+
}
17+
return 0;
18+
}
19+
}
Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
class Solution:
2-
def partitionDisjoint(self, A):
3-
"""
4-
:type A: List[int]
5-
:rtype: int
6-
"""
7-
loc = 0
8-
vmx = A[0]
9-
mx = A[0]
10-
for i, el in enumerate(A):
11-
if el > mx:
12-
mx = el
13-
if el < vmx:
14-
loc = i
15-
vmx = mx
16-
return loc + 1
2+
def partitionDisjoint(self, nums: List[int]) -> int:
3+
n = len(nums)
4+
mi = [inf] * (n + 1)
5+
for i in range(n - 1, -1, -1):
6+
mi[i] = min(nums[i], mi[i + 1])
7+
mx = 0
8+
for i, v in enumerate(nums, 1):
9+
mx = max(mx, v)
10+
if mx <= mi[i]:
11+
return i

0 commit comments

Comments
 (0)