You are given an array of integers start and an integer d, representing
n intervals [start[i], start[i] + d].
You are asked to choose n integers where the ith integer must belong to the ith interval. The score of the chosen integers is defined as the
minimum absolute difference between any two integers that have been chosen.
Return the maximumpossible score of the chosen integers.
Input: start =[6,0,3], d =2Output: 4Explanation:
The maximum possible score can be obtained by choosing integers:8,0, and 4.The score of these chosen integers is`min(|8 - 0|, |8 - 4|, |0 - 4|)` which
equals 4.
Input: start =[2,6,13,13], d =5Output: 5Explanation:
The maximum possible score can be obtained by choosing integers:2,7,13, and
18. The score of these chosen integers is`min(|2 - 7|, |2 - 13|, |2 - 18|, |7
- 13|, |7 - 18|, |13 - 18|)` which equals 5.
To maximize the minimum difference between chosen numbers, we can use binary search on the answer. For each candidate difference, we greedily try to pick numbers from each interval such that each is at least that far apart from the previous.
classSolution {
public:int maximizeScore(vector<int>& start, int d) {
int n = start.size();
sort(start.begin(), start.end());
int l =0, r =1e9, ans =0;
while (l <= r) {
int m = l + (r-l)/2, prev = start[0];
bool ok = true;
for (int i =1; i < n; ++i) {
int nxt = max(prev + m, start[i]);
if (nxt > start[i] + d) { ok = false; break; }
prev = nxt;
}
if (ok) { ans = m; l = m+1; }
else r = m-1;
}
return ans;
}
};
funcmaximizeScore(start []int, dint) int {
sort.Ints(start)
n:= len(start)
l, r, ans:=0, int(1e9), 0forl<=r {
m:= (l+r) /2prev:=start[0]
ok:=truefori:=1; i < n; i++ {
nxt:=prev+mifnxt < start[i] {
nxt = start[i]
}
ifnxt > start[i]+d {
ok = falsebreak }
prev = nxt }
ifok {
ans = ml = m+1 } else {
r = m-1 }
}
returnans}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution {
publicintmaximizeScore(int[] start, int d) {
Arrays.sort(start);
int n = start.length, l = 0, r = (int)1e9, ans = 0;
while (l <= r) {
int m = l + (r-l)/2, prev = start[0];
boolean ok =true;
for (int i = 1; i < n; i++) {
int nxt = Math.max(prev + m, start[i]);
if (nxt > start[i]+ d) { ok =false; break; }
prev = nxt;
}
if (ok) { ans = m; l = m+1; }
else r = m-1;
}
return ans;
}
}
classSolution {
funmaximizeScore(start: IntArray, d: Int): Int {
start.sort()
var l = 0var r = 1_000_000_000
var ans = 0while (l <= r) {
val m = (l + r) / 2var prev = start[0]
var ok = truefor (i in1 until start.size) {
var nxt = maxOf(prev + m, start[i])
if (nxt > start[i] + d) {
ok = falsebreak }
prev = nxt
}
if (ok) {
ans = m
l = m + 1 } else {
r = m - 1 }
}
return ans
}
}
classSolution:
defmaximizeScore(self, start: list[int], d: int) -> int:
start.sort()
n = len(start)
l, r, ans =0, 10**9, 0while l <= r:
m = (l + r) //2 prev = start[0]
ok =Truefor i in range(1, n):
nxt = max(prev + m, start[i])
if nxt > start[i] + d:
ok =Falsebreak prev = nxt
if ok:
ans = m
l = m +1else:
r = m -1return ans
impl Solution {
pubfnmaximize_score(mut start: Vec<i32>, d: i32) -> i32 {
start.sort();
let n = start.len();
let (mut l, mut r, mut ans) = (0, 1_000_000_000, 0);
while l <= r {
let m = (l + r) /2;
letmut prev = start[0];
letmut ok =true;
for i in1..n {
let nxt = prev + m;
let nxt = nxt.max(start[i]);
if nxt > start[i] + d {
ok =false;
break;
}
prev = nxt;
}
if ok {
ans = m;
l = m +1;
} else {
r = m -1;
}
}
ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution {
maximizeScore(start: number[], d: number):number {
start.sort((a, b) =>a-b);
letl=0, r=1e9, ans=0;
while (l<=r) {
letm= Math.floor((l+r) /2), prev=start[0], ok=true;
for (leti=1; i<start.length; i++) {
letnxt= Math.max(prev+m, start[i]);
if (nxt>start[i] +d) { ok=false; break; }
prev=nxt;
}
if (ok) { ans=m; l=m+1; }
elser=m-1;
}
returnans;
}
}