Skip to content

Commit 8c8241f

Browse files
authored
feat: add solutions to lc problem: No.2195 (doocs#2790)
No.2195.Append K Integers With Minimal Sum
1 parent 2e1b18f commit 8c8241f

File tree

7 files changed

+128
-142
lines changed

7 files changed

+128
-142
lines changed

solution/2100-2199/2195.Append K Integers With Minimal Sum/README.md

+46-47
Original file line numberDiff line numberDiff line change
@@ -44,47 +44,42 @@ nums 最终元素和为 5 + 6 + 1 + 2 + 3 + 4 + 7 + 8 = 36 ,这是所有情况
4444

4545
### 方法一:排序 + 贪心 + 数学
4646

47+
我们不妨向数组中加入两个哨兵节点,分别为 $0$ 和 $2 \times 10^9$。
48+
49+
然后我们对数组进行排序,那么对于数组中的任意两个相邻的元素 $a$ 和 $b$,区间 $[a+1, b-1]$ 中的整数都是未出现在数组中的,我们可以将这些整数加入到数组中。
50+
51+
因此,我们从小到大遍历数组中的相邻元素对 $(a, b)$,对于每个相邻元素对,我们计算区间 $[a+1, b-1]$ 中的整数个数 $m$,那么这 $m$ 个整数的和为 $\frac{m \times (a+1 + a+m)}{2}$,我们将这个和累加到答案中,并将 $k$ 减去 $m$。如果 $k$ 减到 $0$,我们就可以停止遍历了,返回答案。
52+
53+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组的长度。
54+
4755
<!-- tabs:start -->
4856

4957
```python
5058
class Solution:
5159
def minimalKSum(self, nums: List[int], k: int) -> int:
52-
nums.append(0)
53-
nums.append(2 * 10**9)
60+
nums.extend([0, 2 * 10**9])
5461
nums.sort()
5562
ans = 0
5663
for a, b in pairwise(nums):
57-
n = min(k, b - a - 1)
58-
if n <= 0:
59-
continue
60-
k -= n
61-
ans += (a + 1 + a + n) * n // 2
62-
if k == 0:
63-
break
64+
m = max(0, min(k, b - a - 1))
65+
ans += (a + 1 + a + m) * m // 2
66+
k -= m
6467
return ans
6568
```
6669

6770
```java
6871
class Solution {
6972
public long minimalKSum(int[] nums, int k) {
70-
int[] arr = new int[nums.length + 2];
71-
arr[arr.length - 1] = (int) 2e9;
72-
for (int i = 0; i < nums.length; ++i) {
73-
arr[i + 1] = nums[i];
74-
}
73+
int n = nums.length;
74+
int[] arr = new int[n + 2];
75+
arr[1] = 2 * 1000000000;
76+
System.arraycopy(nums, 0, arr, 2, n);
7577
Arrays.sort(arr);
7678
long ans = 0;
77-
for (int i = 1; i < arr.length; ++i) {
78-
int a = arr[i - 1], b = arr[i];
79-
int n = Math.min(k, b - a - 1);
80-
if (n <= 0) {
81-
continue;
82-
}
83-
k -= n;
84-
ans += (long) (a + 1 + a + n) * n / 2;
85-
if (k == 0) {
86-
break;
87-
}
79+
for (int i = 0; i < n + 1 && k > 0; ++i) {
80+
int m = Math.max(0, Math.min(k, arr[i + 1] - arr[i] - 1));
81+
ans += (arr[i] + 1L + arr[i] + m) * m / 2;
82+
k -= m;
8883
}
8984
return ans;
9085
}
@@ -99,37 +94,41 @@ public:
9994
nums.push_back(2e9);
10095
sort(nums.begin(), nums.end());
10196
long long ans = 0;
102-
for (int i = 1; i < nums.size(); ++i) {
103-
int a = nums[i - 1], b = nums[i];
104-
int n = min(k, b - a - 1);
105-
if (n <= 0) continue;
106-
k -= n;
107-
ans += 1ll * (a + 1 + a + n) * n / 2;
108-
if (k == 0) break;
97+
for (int i = 0; i < nums.size() - 1 && k > 0; ++i) {
98+
int m = max(0, min(k, nums[i + 1] - nums[i] - 1));
99+
ans += 1LL * (nums[i] + 1 + nums[i] + m) * m / 2;
100+
k -= m;
109101
}
110102
return ans;
111103
}
112104
};
113105
```
114106
115107
```go
116-
func minimalKSum(nums []int, k int) int64 {
117-
nums = append(nums, 0, 2e9)
108+
func minimalKSum(nums []int, k int) (ans int64) {
109+
nums = append(nums, []int{0, 2e9}...)
118110
sort.Ints(nums)
119-
ans := 0
120-
for i := 1; i < len(nums); i++ {
121-
a, b := nums[i-1], nums[i]
122-
n := min(k, b-a-1)
123-
if n <= 0 {
124-
continue
125-
}
126-
k -= n
127-
ans += (a + 1 + a + n) * n / 2
128-
if k == 0 {
129-
break
130-
}
111+
for i, b := range nums[1:] {
112+
a := nums[i]
113+
m := max(0, min(k, b-a-1))
114+
ans += int64(a+1+a+m) * int64(m) / 2
115+
k -= m
131116
}
132-
return int64(ans)
117+
return ans
118+
}
119+
```
120+
121+
```ts
122+
function minimalKSum(nums: number[], k: number): number {
123+
nums.push(...[0, 2 * 10 ** 9]);
124+
nums.sort((a, b) => a - b);
125+
let ans = 0;
126+
for (let i = 0; i < nums.length - 1; ++i) {
127+
const m = Math.max(0, Math.min(k, nums[i + 1] - nums[i] - 1));
128+
ans += Number((BigInt(nums[i] + 1 + nums[i] + m) * BigInt(m)) / BigInt(2));
129+
k -= m;
130+
}
131+
return ans;
133132
}
134133
```
135134

solution/2100-2199/2195.Append K Integers With Minimal Sum/README_EN.md

+47-48
Original file line numberDiff line numberDiff line change
@@ -41,49 +41,44 @@ The sum of the six integers appended is 1 + 2 + 3 + 4 + 7 + 8 = 25, so we return
4141

4242
## Solutions
4343

44-
### Solution 1
44+
### Solution 1: Sorting + Greedy + Mathematics
45+
46+
We can add two sentinel nodes to the array, which are $0$ and $2 \times 10^9$.
47+
48+
Then we sort the array. For any two adjacent elements $a$ and $b$ in the array, the integers in the interval $[a+1, b-1]$ do not appear in the array, and we can add these integers to the array.
49+
50+
Therefore, we traverse the adjacent element pairs $(a, b)$ in the array from small to large. For each adjacent element pair, we calculate the number of integers $m$ in the interval $[a+1, b-1]$. The sum of these $m$ integers is $\frac{m \times (a+1 + a+m)}{2}$. We add this sum to the answer and subtract $m$ from $k$. If $k$ is reduced to $0$, we can stop the traversal and return the answer.
51+
52+
The time complexity is $O(n \times \log n)$, and the space complexity is $O(\log n)$. Where $n$ is the length of the array.
4553

4654
<!-- tabs:start -->
4755

4856
```python
4957
class Solution:
5058
def minimalKSum(self, nums: List[int], k: int) -> int:
51-
nums.append(0)
52-
nums.append(2 * 10**9)
59+
nums.extend([0, 2 * 10**9])
5360
nums.sort()
5461
ans = 0
5562
for a, b in pairwise(nums):
56-
n = min(k, b - a - 1)
57-
if n <= 0:
58-
continue
59-
k -= n
60-
ans += (a + 1 + a + n) * n // 2
61-
if k == 0:
62-
break
63+
m = max(0, min(k, b - a - 1))
64+
ans += (a + 1 + a + m) * m // 2
65+
k -= m
6366
return ans
6467
```
6568

6669
```java
6770
class Solution {
6871
public long minimalKSum(int[] nums, int k) {
69-
int[] arr = new int[nums.length + 2];
70-
arr[arr.length - 1] = (int) 2e9;
71-
for (int i = 0; i < nums.length; ++i) {
72-
arr[i + 1] = nums[i];
73-
}
72+
int n = nums.length;
73+
int[] arr = new int[n + 2];
74+
arr[1] = 2 * 1000000000;
75+
System.arraycopy(nums, 0, arr, 2, n);
7476
Arrays.sort(arr);
7577
long ans = 0;
76-
for (int i = 1; i < arr.length; ++i) {
77-
int a = arr[i - 1], b = arr[i];
78-
int n = Math.min(k, b - a - 1);
79-
if (n <= 0) {
80-
continue;
81-
}
82-
k -= n;
83-
ans += (long) (a + 1 + a + n) * n / 2;
84-
if (k == 0) {
85-
break;
86-
}
78+
for (int i = 0; i < n + 1 && k > 0; ++i) {
79+
int m = Math.max(0, Math.min(k, arr[i + 1] - arr[i] - 1));
80+
ans += (arr[i] + 1L + arr[i] + m) * m / 2;
81+
k -= m;
8782
}
8883
return ans;
8984
}
@@ -98,37 +93,41 @@ public:
9893
nums.push_back(2e9);
9994
sort(nums.begin(), nums.end());
10095
long long ans = 0;
101-
for (int i = 1; i < nums.size(); ++i) {
102-
int a = nums[i - 1], b = nums[i];
103-
int n = min(k, b - a - 1);
104-
if (n <= 0) continue;
105-
k -= n;
106-
ans += 1ll * (a + 1 + a + n) * n / 2;
107-
if (k == 0) break;
96+
for (int i = 0; i < nums.size() - 1 && k > 0; ++i) {
97+
int m = max(0, min(k, nums[i + 1] - nums[i] - 1));
98+
ans += 1LL * (nums[i] + 1 + nums[i] + m) * m / 2;
99+
k -= m;
108100
}
109101
return ans;
110102
}
111103
};
112104
```
113105
114106
```go
115-
func minimalKSum(nums []int, k int) int64 {
116-
nums = append(nums, 0, 2e9)
107+
func minimalKSum(nums []int, k int) (ans int64) {
108+
nums = append(nums, []int{0, 2e9}...)
117109
sort.Ints(nums)
118-
ans := 0
119-
for i := 1; i < len(nums); i++ {
120-
a, b := nums[i-1], nums[i]
121-
n := min(k, b-a-1)
122-
if n <= 0 {
123-
continue
124-
}
125-
k -= n
126-
ans += (a + 1 + a + n) * n / 2
127-
if k == 0 {
128-
break
129-
}
110+
for i, b := range nums[1:] {
111+
a := nums[i]
112+
m := max(0, min(k, b-a-1))
113+
ans += int64(a+1+a+m) * int64(m) / 2
114+
k -= m
130115
}
131-
return int64(ans)
116+
return ans
117+
}
118+
```
119+
120+
```ts
121+
function minimalKSum(nums: number[], k: number): number {
122+
nums.push(...[0, 2 * 10 ** 9]);
123+
nums.sort((a, b) => a - b);
124+
let ans = 0;
125+
for (let i = 0; i < nums.length - 1; ++i) {
126+
const m = Math.max(0, Math.min(k, nums[i + 1] - nums[i] - 1));
127+
ans += Number((BigInt(nums[i] + 1 + nums[i] + m) * BigInt(m)) / BigInt(2));
128+
k -= m;
129+
}
130+
return ans;
132131
}
133132
```
134133

solution/2100-2199/2195.Append K Integers With Minimal Sum/Solution.cpp

+4-7
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,10 @@ class Solution {
55
nums.push_back(2e9);
66
sort(nums.begin(), nums.end());
77
long long ans = 0;
8-
for (int i = 1; i < nums.size(); ++i) {
9-
int a = nums[i - 1], b = nums[i];
10-
int n = min(k, b - a - 1);
11-
if (n <= 0) continue;
12-
k -= n;
13-
ans += 1ll * (a + 1 + a + n) * n / 2;
14-
if (k == 0) break;
8+
for (int i = 0; i < nums.size() - 1 && k > 0; ++i) {
9+
int m = max(0, min(k, nums[i + 1] - nums[i] - 1));
10+
ans += 1LL * (nums[i] + 1 + nums[i] + m) * m / 2;
11+
k -= m;
1512
}
1613
return ans;
1714
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
1-
func minimalKSum(nums []int, k int) int64 {
2-
nums = append(nums, 0, 2e9)
1+
func minimalKSum(nums []int, k int) (ans int64) {
2+
nums = append(nums, []int{0, 2e9}...)
33
sort.Ints(nums)
4-
ans := 0
5-
for i := 1; i < len(nums); i++ {
6-
a, b := nums[i-1], nums[i]
7-
n := min(k, b-a-1)
8-
if n <= 0 {
9-
continue
10-
}
11-
k -= n
12-
ans += (a + 1 + a + n) * n / 2
13-
if k == 0 {
14-
break
15-
}
4+
for i, b := range nums[1:] {
5+
a := nums[i]
6+
m := max(0, min(k, b-a-1))
7+
ans += int64(a+1+a+m) * int64(m) / 2
8+
k -= m
169
}
17-
return int64(ans)
10+
return ans
1811
}

solution/2100-2199/2195.Append K Integers With Minimal Sum/Solution.java

+8-16
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,15 @@
11
class Solution {
22
public long minimalKSum(int[] nums, int k) {
3-
int[] arr = new int[nums.length + 2];
4-
arr[arr.length - 1] = (int) 2e9;
5-
for (int i = 0; i < nums.length; ++i) {
6-
arr[i + 1] = nums[i];
7-
}
3+
int n = nums.length;
4+
int[] arr = new int[n + 2];
5+
arr[1] = 2 * 1000000000;
6+
System.arraycopy(nums, 0, arr, 2, n);
87
Arrays.sort(arr);
98
long ans = 0;
10-
for (int i = 1; i < arr.length; ++i) {
11-
int a = arr[i - 1], b = arr[i];
12-
int n = Math.min(k, b - a - 1);
13-
if (n <= 0) {
14-
continue;
15-
}
16-
k -= n;
17-
ans += (long) (a + 1 + a + n) * n / 2;
18-
if (k == 0) {
19-
break;
20-
}
9+
for (int i = 0; i < n + 1 && k > 0; ++i) {
10+
int m = Math.max(0, Math.min(k, arr[i + 1] - arr[i] - 1));
11+
ans += (arr[i] + 1L + arr[i] + m) * m / 2;
12+
k -= m;
2113
}
2214
return ans;
2315
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
class Solution:
22
def minimalKSum(self, nums: List[int], k: int) -> int:
3-
nums.append(0)
4-
nums.append(2 * 10**9)
3+
nums.extend([0, 2 * 10**9])
54
nums.sort()
65
ans = 0
76
for a, b in pairwise(nums):
8-
n = min(k, b - a - 1)
9-
if n <= 0:
10-
continue
11-
k -= n
12-
ans += (a + 1 + a + n) * n // 2
13-
if k == 0:
14-
break
7+
m = max(0, min(k, b - a - 1))
8+
ans += (a + 1 + a + m) * m // 2
9+
k -= m
1510
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
function minimalKSum(nums: number[], k: number): number {
2+
nums.push(...[0, 2 * 10 ** 9]);
3+
nums.sort((a, b) => a - b);
4+
let ans = 0;
5+
for (let i = 0; i < nums.length - 1; ++i) {
6+
const m = Math.max(0, Math.min(k, nums[i + 1] - nums[i] - 1));
7+
ans += Number((BigInt(nums[i] + 1 + nums[i] + m) * BigInt(m)) / BigInt(2));
8+
k -= m;
9+
}
10+
return ans;
11+
}

0 commit comments

Comments
 (0)