Skip to content

Commit 427d1f0

Browse files
committed
feat: add solutions to lc problem: No.1802
No.1802.Maximum Value at a Given Index in a Bounded Array
1 parent 7081402 commit 427d1f0

File tree

6 files changed

+218
-2
lines changed

6 files changed

+218
-2
lines changed

solution/1800-1899/1802.Maximum Value at a Given Index in a Bounded Array/README.md

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,108 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
**方法一:二分查找**
52+
53+
根据题目描述,如果我们确定了 $nums[index]$ 的值为 $x$,此时我们可以找到一个最小的数组总和。也就是说,在 $index$ 左侧的数组元素从 $x-1$ 一直递减到 $1$,如果还有剩余的元素,那么剩余的元素都为 $1$;同理,在 $index$ 及右侧的数组元素从 $x$ 一直递减到 $1$,如果还有剩余的元素,那么剩余的元素都为 $1$。
54+
55+
这样我们就可以计算出数组的总和,如果总和小于等于 $maxSum$,那么此时的 $x$ 是合法的。随着 $x$ 的增大,数组的总和也会增大,因此我们可以使用二分查找的方法,找到一个最大的且符合条件的 $x$。
56+
57+
为了方便计算数组左侧、右侧的元素之和,我们定义一个函数 $sum(x, cnt)$,表示一共有 $cnt$ 个元素,且最大值为 $x$ 的数组的总和。函数 $sum(x, cnt)$ 可以分为两种情况:
58+
59+
- 如果 $x \geq cnt$,那么数组的总和为 $\frac{(x + x - cnt + 1) \times cnt}{2}$
60+
- 如果 $x \lt cnt$,那么数组的总和为 $\frac{(x + 1) \times x}{2} + cnt - x$
61+
62+
接下来,定义二分的左边界 $left = 1$,右边界 $right = maxSum$,然后二分查找 $nums[index]$ 的值 $mid$,如果 $sum(mid - 1, index) + sum(mid, n - index) \leq maxSum$,那么此时的 $mid$ 是合法的,我们可以将 $left$ 更新为 $mid$,否则我们将 $right$ 更新为 $mid - 1$。
63+
64+
最后将 $left$ 作为答案返回即可。
65+
66+
时间复杂度 $O(\log M)$,空间复杂度 $O(1)$。其中 $M=maxSum$。
67+
5168
<!-- tabs:start -->
5269

5370
### **Python3**
5471

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

5774
```python
58-
75+
class Solution:
76+
def maxValue(self, n: int, index: int, maxSum: int) -> int:
77+
def sum(x, cnt):
78+
return (x + x - cnt + 1) * cnt // 2 if x >= cnt else (x + 1) * x // 2 + cnt - x
79+
80+
left, right = 1, maxSum
81+
while left < right:
82+
mid = (left + right + 1) >> 1
83+
if sum(mid - 1, index) + sum(mid, n - index) <= maxSum:
84+
left = mid
85+
else:
86+
right = mid - 1
87+
return left
5988
```
6089

6190
### **Java**
6291

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

6594
```java
95+
class Solution {
96+
public int maxValue(int n, int index, int maxSum) {
97+
int left = 1, right = maxSum;
98+
while (left < right) {
99+
int mid = (left + right + 1) >>> 1;
100+
if (sum(mid - 1, index) + sum(mid, n - index) <= maxSum) {
101+
left = mid;
102+
} else {
103+
right = mid - 1;
104+
}
105+
}
106+
return left;
107+
}
108+
109+
private long sum(long x, int cnt) {
110+
return x >= cnt ? (x + x - cnt + 1) * cnt / 2 : (x + 1) * x / 2 + cnt - x;
111+
}
112+
}
113+
```
114+
115+
### **C++**
116+
117+
```cpp
118+
class Solution {
119+
public:
120+
int maxValue(int n, int index, int maxSum) {
121+
auto sum = [](long x, int cnt) {
122+
return x >= cnt ? (x + x - cnt + 1) * cnt / 2 : (x + 1) * x / 2 + cnt - x;
123+
};
124+
int left = 1, right = maxSum;
125+
while (left < right) {
126+
int mid = (left + right + 1) >> 1;
127+
if (sum(mid - 1, index) + sum(mid, n - index) <= maxSum) {
128+
left = mid;
129+
} else {
130+
right = mid - 1;
131+
}
132+
}
133+
return left;
134+
}
135+
};
136+
```
66137
138+
### **Go**
139+
140+
```go
141+
func maxValue(n int, index int, maxSum int) int {
142+
sum := func(x, cnt int) int {
143+
if x >= cnt {
144+
return (x + x - cnt + 1) * cnt / 2
145+
}
146+
return (x+1)*x/2 + cnt - x
147+
}
148+
return sort.Search(maxSum, func(x int) bool {
149+
x++
150+
return sum(x-1, index)+sum(x, n-index) > maxSum
151+
})
152+
}
67153
```
68154

69155
### **...**

solution/1800-1899/1802.Maximum Value at a Given Index in a Bounded Array/README_EN.md

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,82 @@ There are no arrays that satisfy all the conditions and have nums[2] == 3, so 2
5050
### **Python3**
5151

5252
```python
53-
53+
class Solution:
54+
def maxValue(self, n: int, index: int, maxSum: int) -> int:
55+
def sum(x, cnt):
56+
return (x + x - cnt + 1) * cnt // 2 if x >= cnt else (x + 1) * x // 2 + cnt - x
57+
58+
left, right = 1, maxSum
59+
while left < right:
60+
mid = (left + right + 1) >> 1
61+
if sum(mid - 1, index) + sum(mid, n - index) <= maxSum:
62+
left = mid
63+
else:
64+
right = mid - 1
65+
return left
5466
```
5567

5668
### **Java**
5769

5870
```java
71+
class Solution {
72+
public int maxValue(int n, int index, int maxSum) {
73+
int left = 1, right = maxSum;
74+
while (left < right) {
75+
int mid = (left + right + 1) >>> 1;
76+
if (sum(mid - 1, index) + sum(mid, n - index) <= maxSum) {
77+
left = mid;
78+
} else {
79+
right = mid - 1;
80+
}
81+
}
82+
return left;
83+
}
84+
85+
private long sum(long x, int cnt) {
86+
return x >= cnt ? (x + x - cnt + 1) * cnt / 2 : (x + 1) * x / 2 + cnt - x;
87+
}
88+
}
89+
```
90+
91+
### **C++**
92+
93+
```cpp
94+
class Solution {
95+
public:
96+
int maxValue(int n, int index, int maxSum) {
97+
auto sum = [](long x, int cnt) {
98+
return x >= cnt ? (x + x - cnt + 1) * cnt / 2 : (x + 1) * x / 2 + cnt - x;
99+
};
100+
int left = 1, right = maxSum;
101+
while (left < right) {
102+
int mid = (left + right + 1) >> 1;
103+
if (sum(mid - 1, index) + sum(mid, n - index) <= maxSum) {
104+
left = mid;
105+
} else {
106+
right = mid - 1;
107+
}
108+
}
109+
return left;
110+
}
111+
};
112+
```
59113
114+
### **Go**
115+
116+
```go
117+
func maxValue(n int, index int, maxSum int) int {
118+
sum := func(x, cnt int) int {
119+
if x >= cnt {
120+
return (x + x - cnt + 1) * cnt / 2
121+
}
122+
return (x+1)*x/2 + cnt - x
123+
}
124+
return sort.Search(maxSum, func(x int) bool {
125+
x++
126+
return sum(x-1, index)+sum(x, n-index) > maxSum
127+
})
128+
}
60129
```
61130

62131
### **...**
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
int maxValue(int n, int index, int maxSum) {
4+
auto sum = [](long x, int cnt) {
5+
return x >= cnt ? (x + x - cnt + 1) * cnt / 2 : (x + 1) * x / 2 + cnt - x;
6+
};
7+
int left = 1, right = maxSum;
8+
while (left < right) {
9+
int mid = (left + right + 1) >> 1;
10+
if (sum(mid - 1, index) + sum(mid, n - index) <= maxSum) {
11+
left = mid;
12+
} else {
13+
right = mid - 1;
14+
}
15+
}
16+
return left;
17+
}
18+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
func maxValue(n int, index int, maxSum int) int {
2+
sum := func(x, cnt int) int {
3+
if x >= cnt {
4+
return (x + x - cnt + 1) * cnt / 2
5+
}
6+
return (x+1)*x/2 + cnt - x
7+
}
8+
return sort.Search(maxSum, func(x int) bool {
9+
x++
10+
return sum(x-1, index)+sum(x, n-index) > maxSum
11+
})
12+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public int maxValue(int n, int index, int maxSum) {
3+
int left = 1, right = maxSum;
4+
while (left < right) {
5+
int mid = (left + right + 1) >>> 1;
6+
if (sum(mid - 1, index) + sum(mid, n - index) <= maxSum) {
7+
left = mid;
8+
} else {
9+
right = mid - 1;
10+
}
11+
}
12+
return left;
13+
}
14+
15+
private long sum(long x, int cnt) {
16+
return x >= cnt ? (x + x - cnt + 1) * cnt / 2 : (x + 1) * x / 2 + cnt - x;
17+
}
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def maxValue(self, n: int, index: int, maxSum: int) -> int:
3+
def sum(x, cnt):
4+
return (x + x - cnt + 1) * cnt // 2 if x >= cnt else (x + 1) * x // 2 + cnt - x
5+
6+
left, right = 1, maxSum
7+
while left < right:
8+
mid = (left + right + 1) >> 1
9+
if sum(mid - 1, index) + sum(mid, n - index) <= maxSum:
10+
left = mid
11+
else:
12+
right = mid - 1
13+
return left

0 commit comments

Comments
 (0)