Skip to content

Commit 82c3e31

Browse files
committed
feat: add solutions to lc problem: No.2294
No.2294.Partition Array Such That Maximum Difference Is K
1 parent 322da71 commit 82c3e31

File tree

8 files changed

+74
-103
lines changed

8 files changed

+74
-103
lines changed

solution/2200-2299/2294.Partition Array Such That Maximum Difference Is K/README.md

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@
6565

6666
<!-- 这里可写通用的实现逻辑 -->
6767

68-
**方法一:排序**
68+
**方法一:贪心 + 排序**
69+
70+
题目是要求划分子序列,而不是子数组,因此子序列中的元素可以不连续。我们可以将数组 `nums` 排序,假设当前子序列的第一个元素为 $a$,则子序列中的最大值和最小值的差值不会超过 $k$。因此我们可以遍历数组 `nums`,如果当前元素 $b$ 与 $a$ 的差值大于 $k$,则更新 $a$ 为 $b$,并将子序列数目加 1。遍历结束后,即可得到最少子序列数目,注意初始时子序列数目为 $1$。
71+
72+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组 `nums` 的长度。
6973

7074
<!-- tabs:start -->
7175

@@ -77,12 +81,11 @@
7781
class Solution:
7882
def partitionArray(self, nums: List[int], k: int) -> int:
7983
nums.sort()
80-
d, ans = 0, 1
81-
for a, b in pairwise(nums):
82-
if (t := b - a) + d <= k:
83-
d += t
84-
else:
85-
d, ans = 0, ans + 1
84+
ans, a = 1, nums[0]
85+
for b in nums:
86+
if b - a > k:
87+
a = b
88+
ans += 1
8689
return ans
8790
```
8891

@@ -94,14 +97,10 @@ class Solution:
9497
class Solution {
9598
public int partitionArray(int[] nums, int k) {
9699
Arrays.sort(nums);
97-
int d = 0, ans = 1;
98-
for (int i = 1; i < nums.length; ++i) {
99-
int a = nums[i - 1], b = nums[i];
100-
int t = b - a;
101-
if (d + t <= k) {
102-
d += t;
103-
} else {
104-
d = 0;
100+
int ans = 1, a = nums[0];
101+
for (int b : nums) {
102+
if (b - a > k) {
103+
a = b;
105104
++ans;
106105
}
107106
}
@@ -117,14 +116,10 @@ class Solution {
117116
public:
118117
int partitionArray(vector<int>& nums, int k) {
119118
sort(nums.begin(), nums.end());
120-
int d = 0, ans = 1;
121-
for (int i = 1; i < nums.size(); ++i) {
122-
int a = nums[i - 1], b = nums[i];
123-
int t = b - a;
124-
if (d + t <= k)
125-
d += t;
126-
else {
127-
d = 0;
119+
int ans = 1, a = nums[0];
120+
for (int& b : nums) {
121+
if (b - a > k) {
122+
a = b;
128123
++ans;
129124
}
130125
}
@@ -138,13 +133,10 @@ public:
138133
```go
139134
func partitionArray(nums []int, k int) int {
140135
sort.Ints(nums)
141-
d, ans := 0, 1
142-
for i, v := range nums[1:] {
143-
t := v - nums[i]
144-
if d+t <= k {
145-
d += t
146-
} else {
147-
d = 0
136+
ans, a := 1, nums[0]
137+
for _, b := range nums {
138+
if b-a > k {
139+
a = b
148140
ans++
149141
}
150142
}
@@ -158,11 +150,12 @@ func partitionArray(nums []int, k int) int {
158150
function partitionArray(nums: number[], k: number): number {
159151
nums.sort((a, b) => a - b);
160152
let ans = 1;
161-
let prev = nums[0] + k;
162-
for (let num of nums) {
163-
if (num <= prev) continue;
164-
prev = num + k;
165-
ans++;
153+
let a = nums[0];
154+
for (const b of nums) {
155+
if (b - a > k) {
156+
a = b;
157+
++ans;
158+
}
166159
}
167160
return ans;
168161
}

solution/2200-2299/2294.Partition Array Such That Maximum Difference Is K/README_EN.md

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,11 @@ Since three subsequences were created, we return 3. It can be shown that 3 is th
6767
class Solution:
6868
def partitionArray(self, nums: List[int], k: int) -> int:
6969
nums.sort()
70-
d, ans = 0, 1
71-
for a, b in pairwise(nums):
72-
if (t := b - a) + d <= k:
73-
d += t
74-
else:
75-
d, ans = 0, ans + 1
70+
ans, a = 1, nums[0]
71+
for b in nums:
72+
if b - a > k:
73+
a = b
74+
ans += 1
7675
return ans
7776
```
7877

@@ -82,14 +81,10 @@ class Solution:
8281
class Solution {
8382
public int partitionArray(int[] nums, int k) {
8483
Arrays.sort(nums);
85-
int d = 0, ans = 1;
86-
for (int i = 1; i < nums.length; ++i) {
87-
int a = nums[i - 1], b = nums[i];
88-
int t = b - a;
89-
if (d + t <= k) {
90-
d += t;
91-
} else {
92-
d = 0;
84+
int ans = 1, a = nums[0];
85+
for (int b : nums) {
86+
if (b - a > k) {
87+
a = b;
9388
++ans;
9489
}
9590
}
@@ -105,14 +100,10 @@ class Solution {
105100
public:
106101
int partitionArray(vector<int>& nums, int k) {
107102
sort(nums.begin(), nums.end());
108-
int d = 0, ans = 1;
109-
for (int i = 1; i < nums.size(); ++i) {
110-
int a = nums[i - 1], b = nums[i];
111-
int t = b - a;
112-
if (d + t <= k)
113-
d += t;
114-
else {
115-
d = 0;
103+
int ans = 1, a = nums[0];
104+
for (int& b : nums) {
105+
if (b - a > k) {
106+
a = b;
116107
++ans;
117108
}
118109
}
@@ -126,13 +117,10 @@ public:
126117
```go
127118
func partitionArray(nums []int, k int) int {
128119
sort.Ints(nums)
129-
d, ans := 0, 1
130-
for i, v := range nums[1:] {
131-
t := v - nums[i]
132-
if d+t <= k {
133-
d += t
134-
} else {
135-
d = 0
120+
ans, a := 1, nums[0]
121+
for _, b := range nums {
122+
if b-a > k {
123+
a = b
136124
ans++
137125
}
138126
}
@@ -146,11 +134,12 @@ func partitionArray(nums []int, k int) int {
146134
function partitionArray(nums: number[], k: number): number {
147135
nums.sort((a, b) => a - b);
148136
let ans = 1;
149-
let prev = nums[0] + k;
150-
for (let num of nums) {
151-
if (num <= prev) continue;
152-
prev = num + k;
153-
ans++;
137+
let a = nums[0];
138+
for (const b of nums) {
139+
if (b - a > k) {
140+
a = b;
141+
++ans;
142+
}
154143
}
155144
return ans;
156145
}

solution/2200-2299/2294.Partition Array Such That Maximum Difference Is K/Solution.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,10 @@ class Solution {
22
public:
33
int partitionArray(vector<int>& nums, int k) {
44
sort(nums.begin(), nums.end());
5-
int d = 0, ans = 1;
6-
for (int i = 1; i < nums.size(); ++i) {
7-
int a = nums[i - 1], b = nums[i];
8-
int t = b - a;
9-
if (d + t <= k)
10-
d += t;
11-
else {
12-
d = 0;
5+
int ans = 1, a = nums[0];
6+
for (int& b : nums) {
7+
if (b - a > k) {
8+
a = b;
139
++ans;
1410
}
1511
}

solution/2200-2299/2294.Partition Array Such That Maximum Difference Is K/Solution.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
func partitionArray(nums []int, k int) int {
22
sort.Ints(nums)
3-
d, ans := 0, 1
4-
for i, v := range nums[1:] {
5-
t := v - nums[i]
6-
if d+t <= k {
7-
d += t
8-
} else {
9-
d = 0
3+
ans, a := 1, nums[0]
4+
for _, b := range nums {
5+
if b-a > k {
6+
a = b
107
ans++
118
}
129
}

solution/2200-2299/2294.Partition Array Such That Maximum Difference Is K/Solution.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
class Solution {
22
public int partitionArray(int[] nums, int k) {
33
Arrays.sort(nums);
4-
int d = 0, ans = 1;
5-
for (int i = 1; i < nums.length; ++i) {
6-
int a = nums[i - 1], b = nums[i];
7-
int t = b - a;
8-
if (d + t <= k) {
9-
d += t;
10-
} else {
11-
d = 0;
4+
int ans = 1, a = nums[0];
5+
for (int b : nums) {
6+
if (b - a > k) {
7+
a = b;
128
++ans;
139
}
1410
}
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
class Solution:
22
def partitionArray(self, nums: List[int], k: int) -> int:
33
nums.sort()
4-
d, ans = 0, 1
5-
for a, b in pairwise(nums):
6-
if (t := b - a) + d <= k:
7-
d += t
8-
else:
9-
d, ans = 0, ans + 1
4+
ans, a = 1, nums[0]
5+
for b in nums:
6+
if b - a > k:
7+
a = b
8+
ans += 1
109
return ans
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
function partitionArray(nums: number[], k: number): number {
22
nums.sort((a, b) => a - b);
33
let ans = 1;
4-
let prev = nums[0] + k;
5-
for (let num of nums) {
6-
if (num <= prev) continue;
7-
prev = num + k;
8-
ans++;
4+
let a = nums[0];
5+
for (const b of nums) {
6+
if (b - a > k) {
7+
a = b;
8+
++ans;
9+
}
910
}
1011
return ans;
1112
}

0 commit comments

Comments
 (0)