Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using array strategy.
Given an integer array arr and a target value target, return the integer value such that when we change all the integers larger than value in the given array to be equal to value, the sum of the array gets as close as possible (in absolute difference) to target.
In case of a tie, return the minimum such integer.
Notice that the answer is not neccesarilly a number from arr.
Example 1:
Input: arr = [4,9,3], target = 10 Output: 3 Explanation: When using 3 arr converts to [3, 3, 3] which sums 9 and that's the optimal answer.
Example 2:
Input: arr = [2,3,5], target = 10 Output: 5
Example 3:
Input: arr = [60864,25176,27249,21296,20204], target = 56803 Output: 11361
Constraints:
1 <= arr.length <= 1041 <= arr[i], target <= 105Problem summary: Given an integer array arr and a target value target, return the integer value such that when we change all the integers larger than value in the given array to be equal to value, the sum of the array gets as close as possible (in absolute difference) to target. In case of a tie, return the minimum such integer. Notice that the answer is not neccesarilly a number from arr.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Binary Search
[4,9,3] 10
[2,3,5] 10
[60864,25176,27249,21296,20204] 56803
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1300: Sum of Mutated Array Closest to Target
class Solution {
public int findBestValue(int[] arr, int target) {
Arrays.sort(arr);
int n = arr.length;
int[] s = new int[n + 1];
int mx = 0;
for (int i = 0; i < n; ++i) {
s[i + 1] = s[i] + arr[i];
mx = Math.max(mx, arr[i]);
}
int ans = 0, diff = 1 << 30;
for (int value = 0; value <= mx; ++value) {
int i = search(arr, value);
int d = Math.abs(s[i] + (n - i) * value - target);
if (diff > d) {
diff = d;
ans = value;
}
}
return ans;
}
private int search(int[] arr, int x) {
int left = 0, right = arr.length;
while (left < right) {
int mid = (left + right) >> 1;
if (arr[mid] > x) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
}
// Accepted solution for LeetCode #1300: Sum of Mutated Array Closest to Target
func findBestValue(arr []int, target int) (ans int) {
sort.Ints(arr)
n := len(arr)
s := make([]int, n+1)
mx := slices.Max(arr)
for i, x := range arr {
s[i+1] = s[i] + x
}
diff := 1 << 30
for value := 0; value <= mx; value++ {
i := sort.SearchInts(arr, value+1)
d := abs(s[i] + (n-i)*value - target)
if diff > d {
diff = d
ans = value
}
}
return
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
# Accepted solution for LeetCode #1300: Sum of Mutated Array Closest to Target
class Solution:
def findBestValue(self, arr: List[int], target: int) -> int:
arr.sort()
s = list(accumulate(arr, initial=0))
ans, diff = 0, inf
for value in range(max(arr) + 1):
i = bisect_right(arr, value)
d = abs(s[i] + (len(arr) - i) * value - target)
if diff > d:
diff = d
ans = value
return ans
// Accepted solution for LeetCode #1300: Sum of Mutated Array Closest to Target
struct Solution;
impl Solution {
fn find_best_value(mut arr: Vec<i32>, mut target: i32) -> i32 {
arr.sort_unstable();
let n = arr.len();
let mut i = 0;
while i < n && target > arr[i] * (n - i) as i32 {
target -= arr[i];
i += 1;
}
if i == n {
return arr[n - 1];
}
let res = target / (n - i) as i32;
if (res + 1) * (n - i) as i32 - target < target - res * (n - i) as i32 {
res + 1
} else {
res
}
}
}
#[test]
fn test() {
let arr = vec![4, 9, 3];
let target = 10;
let res = 3;
assert_eq!(Solution::find_best_value(arr, target), res);
let arr = vec![2, 3, 5];
let target = 10;
let res = 5;
assert_eq!(Solution::find_best_value(arr, target), res);
let arr = vec![60864, 25176, 27249, 21296, 20204];
let target = 56803;
let res = 11361;
assert_eq!(Solution::find_best_value(arr, target), res);
}
// Accepted solution for LeetCode #1300: Sum of Mutated Array Closest to Target
// Auto-generated TypeScript example from java.
function exampleSolution(): void {
}
// Reference (java):
// // Accepted solution for LeetCode #1300: Sum of Mutated Array Closest to Target
// class Solution {
// public int findBestValue(int[] arr, int target) {
// Arrays.sort(arr);
// int n = arr.length;
// int[] s = new int[n + 1];
// int mx = 0;
// for (int i = 0; i < n; ++i) {
// s[i + 1] = s[i] + arr[i];
// mx = Math.max(mx, arr[i]);
// }
// int ans = 0, diff = 1 << 30;
// for (int value = 0; value <= mx; ++value) {
// int i = search(arr, value);
// int d = Math.abs(s[i] + (n - i) * value - target);
// if (diff > d) {
// diff = d;
// ans = value;
// }
// }
// return ans;
// }
//
// private int search(int[] arr, int x) {
// int left = 0, right = arr.length;
// while (left < right) {
// int mid = (left + right) >> 1;
// if (arr[mid] > x) {
// right = mid;
// } else {
// left = mid + 1;
// }
// }
// return left;
// }
// }
Use this to step through a reusable interview workflow for this problem.
Check every element from left to right until we find the target or exhaust the array. Each comparison is O(1), and we may visit all n elements, giving O(n). No extra space needed.
Each comparison eliminates half the remaining search space. After k comparisons, the space is n/2ᵏ. We stop when the space is 1, so k = log₂ n. No extra memory needed — just two pointers (lo, hi).
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Wrong move: Setting `lo = mid` or `hi = mid` can stall and create an infinite loop.
Usually fails on: Two-element ranges never converge.
Fix: Use `lo = mid + 1` or `hi = mid - 1` where appropriate.