通过率 40% · 提交 1,049 · 通过 415
小慕正在处理一个图像处理项目,图像有n个,存储在一个长度为n的数组img里,每个像素点的取值范围是[0, 255]的正整数。 小慕需要给图像每个像素点的值加上一个整数k(可以是负数),得到新图newImg,使得新图newImg的所有像素。 请你帮小慕输出这个整数k。
这类题属于华为 OD 机考真题方向中「100分 / 二分查找」方向的高频题型,通常考察对「100分 / 二分查找」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
n个整数,中间用空格分开
一个整数k
示例 1
输入示例
129 130 129 130
输出示例
-2
-1的均值128.5,-2的均值为127.5,输出较小的数-2
示例 2
输入示例
0 0 0 0
输出示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
如果题目描述中没有以下这句话,那么本题非常简单:
> 新图的像素值会自动截取到 [0, 255] 范围。当新像素值 < 0,其值会更改为 0;当新像素值 > 255,其值会更改为 255;例如 newImg = "-1 -2 256",会自动更改为 "0 0 255"。
由于上述这个限制,当我们选取一个特定的值 k 的时候,原数组并不会整体增加 n * k(其中 n 是原数组的长度)。
我们考虑这个问题的二段性:
k 取一个绝对值很大的负数时,譬如 -255,那么所有像素值均会被更改为 0,此时新数组平均数为 0。k 取一个绝对值很大的正数时,譬如 255,那么所有像素值均会被更改为 255,此时新数组平均数为 255。因此,存在一个特定的 k = ans,能够使得新数组的所有像素值的平均值恰好大于等于 128。此时 k = ans 和 k = ans - 1 这两个数,都是有可能使得像素值最接近 128 的结果,再加上一个判断即可。
上述二段性问题显然可以直接使用二分查找来完成。
接下来考虑二分查找的子问题 cal_new_average(nums, k, n)。
在确定了某一个特定的 k 的情况下,我们可以非常方便地计算出新数组的平均值。其过程如下:
1. 遍历原数组中的每一个数字 num,将其 +k 得到修改后的新元素 new_num。 2. 在遍历中,若:
new_num 的值小于 0,则将其设置为 0。new_num 的值大于 255,则将其设置为 255。3. 将 new_num 的值加入一个新的变量 new_sum 中,表示新数组的和。 4. 遍历结束后,计算 new_sum / n 作为函数返回值。
剩余的二分主框架部分,就是直接套模板了。
复杂度分析 设 n 为像素点个数(数组 img 的长度)。
因此总时间复杂度为 O(n)(严格写是 O(n log 511),其中 log 511 不超过 10,可视为常数因子),瓶颈只在每轮对整个数组的一趟扫描。空间上只用 new_sum、new_num 等常数个变量,除输入外额外空间复杂度为 O(1)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
128
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有