- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
java解法
- 解题思路
- 目标:找到一个调整值 k,使对像素值调整后,像素值的平均值尽可能接近128。
调整规则:
每个像素值 pixel 被调整为 newVal = max(0, min(255, pixel + k))。
调整后需满足范围 [0, 255]。
二分搜索:
利用二分搜索的思想在 k ∈ [-127, 128] 范围内搜索。
对每个中间值 mid,计算调整后的平均值 currentAvg。
根据 currentAvg 与128的差异更新最优调整值 bestK。
如果 currentAvg < 128,说明需要增大 k,否则需要减小 k。
最终返回:
找到的最优调整值 k。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int[] pixels = Arrays.stream(str.split(" ")).mapToInt(Integer::parseInt).toArray();
System.out.println(findBestK(pixels));
}
public static int findBestK(int[] pixels) {
int left = -127, right = 128;
int bestK = 0;
double bestDiff = Double.MAX_VALUE;
while (left <= right) {
int mid = (left + right) / 2;
double currentAvg = calculateAvg(pixels, mid);
double diff = Math.abs(currentAvg - 128);
if (diff < bestDiff || (diff == bestDiff && mid < bestK)) {
bestDiff = diff;
bestK = mid;
}
if (currentAvg < 128) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return bestK;
}
public static double calculateAvg(int[] pixels, int k) {
double sum = 0;
for (int pixel : pixels) {
int newVal = Math.max(0, Math.min(pixel + k, 255));
sum += newVal;
}
return sum / pixels.length;
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
C++解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
-
解题思路
-
目标: 找到一个调整值 k,使调整后的数组中所有像素值的平均值尽可能接近 128。
像素值调整规则:
每个像素值 arr[i] 被调整为 newVal = Math.min(255, Math.max(0, arr[i] + k)),确保调整后的像素值在 [0, 255] 范围内。
搜索范围:
使用二分搜索在 [-127, 128] 范围内寻找最优的调整值 k。
优化准则:
目标是让调整后数组的平均值与128的绝对差值最小。
如果差值相等,选择较小的 k。
二分搜索过程:
计算当前中间值 mid 的调整后平均值与128的差异。
根据与128的关系调整搜索范围。
最终返回:
找到的最优调整值 k。
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
const arr = line.split(" ").map(Number);
console.log(findOptimalK(arr));
});
function findOptimalK(arr) {
let left = -127, right = 128;
let bestK = 0, bestDiff = Infinity;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
const diffMid = calculateDiff(arr, mid);
if (diffMid < bestDiff) {
bestDiff = diffMid;
bestK = mid;
} else if (diffMid === bestDiff) {
bestK = Math.min(bestK, mid);
}
if (calculateDiff(arr, mid - 1) < diffMid) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return bestK;
}
function calculateDiff(arr, k) {
let sum = 0;
for (let i = 0; i < arr.length; i++) {
let newVal = arr[i] + k;
newVal = newVal < 0 ? 0 : newVal > 255 ? 255 : newVal;
sum += newVal;
}
return Math.abs(sum / arr.length - 128);
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: