一、题目描述
一个图像有n个像素点,存储在一个长度为n的数组img里,每个像素点的取值范围是[0,255]的正整数。要求找到一个整数k,使得给图像每个像素点值加上k后,新图像newimg的所有像素平均值最接近中位值128。输出这个整数k。
二、解题思路
-
读取输入:首先读取输入的整数数组,即图像的像素点值。
-
初始化变量:
- num:表示像素点的个数,即数组的长度。
- diff:用于记录当前差值的绝对值,初始化为最大值。
- ret:用于记录最小差值对应的整数k,初始化为null。
-
遍历k的取值范围:由于k可以是负数,且考虑到像素值的范围在[0,255],因此k的取值范围可以设定为[-127,128]。遍历这个范围,计算每个k值对应的新图像像素值的平均值,并找出最接近128的平均值对应的k值。
-
计算新图像像素值:对于每个像素值,将其加上k,并进行范围限制,确保新像素值在[0,255]范围内。如果新像素值小于0,则更改为0;如果大于255,则更改为255。
-
更新差值:计算新图像像素值的总和,并求出平均值。计算该平均值与128的差值(取绝对值),如果比当前的diff小,则更新diff和ret。
-
输出结果:遍历结束后,输出ret,即为所求的整数k。
三、代码实现(Java示例)
以下是一个Java实现的示例代码:
package cn.gov.test.gt4.swjggl.leetcode;
import java.util.Arrays;
public class ImageAdjuster {
/**
* 找到一个整数k,使得给定图像每个像素点值加上k后,新图像的像素平均值最接近128。
*
* @param img 原始图像的像素数组,每个像素值范围在[0, 255]
* @return 整数k,使得调整后的图像平均值最接近128
*/
public static Integer adjustImage(int[] img) {
// 初始化变量
int num = img.length; // 图像像素点数量
int diff = Integer.MAX_VALUE; // 初始差值设为最大值
Integer ret = null; // 最终返回的结果k,默认为null
// 遍历所有可能的k值
for (int k = -127; k <= 128; k++) {
// 计算新图像像素值
int sum = 0;
for (int pixel : img) {
int newPixel = Math.max(0, Math.min(255, pixel + k));
sum += newPixel;
}
// 计算新图像的平均值并更新差值
int avg = sum / num;
int currentDiff = Math.abs(avg - 128);
if (currentDiff < diff) {
diff = currentDiff;
ret = k;
}
}
return ret; // 输出结果
}
public static void main(String[] args) {
int[] img = {50, 100, 150, 200}; // 示例输入
System.out.println("调整图像所需的k值为:" + adjustImage(img));
}
}
四、注意事项
- 输入格式:输入为n个整数,表示图像的像素点值,中间用空格分开。
- 输出格式:输出一个整数k,使得新图像的像素平均值最接近128。
- 边界条件:注意处理k的取值范围以及新像素值的范围限制。