news 2026/5/10 18:23:40

算法题 最小差值 I

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法题 最小差值 I

908. 最小差值 I

问题描述

给你一个整数数组nums和一个整数k。你可以选择数组中的任一元素并将其替换为[num - k, num + k]范围内的任意整数。

在应用此操作至多一次后,求数组中最大值和最小值之间的最小可能差值。

示例

输入: nums = [1], k = 0 输出: 0 解释: 数组只有一个元素,最大值和最小值相同,差值为0。 输入: nums = [0,10], k = 2 输出: 6 解释: 将0变为2,将10变为8,数组变为[2,8],差值为6。 输入: nums = [1,3,6], k = 3 输出: 0 解释: 将 nums 改为 [4,4,4]。分数是 max(nums) - min(nums) = 4 - 4 = 0。

算法思路

贪心策略

  1. 找到原数组的最大值maxNum和最小值minNum
  2. 目标是让最大值尽可能小,最小值尽可能大
  3. 最优策略是:
    • 将最小值增加k(变为minNum + k
    • 将最大值减少k(变为maxNum - k
  4. 如果minNum + k >= maxNum - k,说明可以将所有元素调整到同一个值,差值为0
  5. 否则,最小差值为(maxNum - k) - (minNum + k) = maxNum - minNum - 2*k

代码实现

方法一:直接计算

classSolution{/** * 计算应用操作后数组最大值和最小值的最小可能差值 * * @param nums 输入整数数组 * @param k 可调整的范围参数 * @return 最小可能差值 */publicintsmallestRangeI(int[]nums,intk){// 找到数组中的最大值和最小值intminNum=nums[0];intmaxNum=nums[0];for(intnum:nums){minNum=Math.min(minNum,num);maxNum=Math.max(maxNum,num);}// 计算调整后的最小差值// 最小值最多可以增加到 minNum + k// 最大值最多可以减少到 maxNum - kintadjustedMin=minNum+k;intadjustedMax=maxNum-k;// 如果调整后的最小值 >= 调整后的最大值,说明可以完全重合,差值为0if(adjustedMin>=adjustedMax){return0;}// 否则返回调整后的差值returnadjustedMax-adjustedMin;}}

方法二:优化

classSolution{/** * 优化 * * @param nums 输入整数数组 * @param k 可调整的范围参数 * @return 最小可能差值 */publicintsmallestRangeI(int[]nums,intk){intminNum=Arrays.stream(nums).min().getAsInt();intmaxNum=Arrays.stream(nums).max().getAsInt();returnMath.max(0,maxNum-minNum-2*k);}}

算法分析

  • 时间复杂度:O(n)
    • 需要遍历数组一次找到最大值和最小值
  • 空间复杂度:O(1)
    • 只使用了常数个额外变量

算法过程

输入:nums = [1,3,6], k = 3

  1. 找到minNum = 1,maxNum = 6
  2. 计算adjustedMin = 1 + 3 = 4
  3. 计算adjustedMax = 6 - 3 = 3
  4. 由于4 >= 3,返回0

输入:nums = [0,10], k = 2

  1. 找到minNum = 0,maxNum = 10
  2. 计算adjustedMin = 0 + 2 = 2
  3. 计算adjustedMax = 10 - 2 = 8
  4. 由于2 < 8,返回8 - 2 = 6

输入:nums = [1], k = 0

  1. 找到minNum = 1,maxNum = 1
  2. 计算adjustedMin = 1 + 0 = 1
  3. 计算adjustedMax = 1 - 0 = 1
  4. 由于1 >= 1,返回0

测试用例

publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:单元素数组int[]nums1={1};System.out.println("Test 1: "+solution.smallestRangeI(nums1,0));// 0// 测试用例2:标准示例int[]nums2={0,10};System.out.println("Test 2: "+solution.smallestRangeI(nums2,2));// 6// 测试用例3:可以完全重合int[]nums3={1,3,6};System.out.println("Test 3: "+solution.smallestRangeI(nums3,3));// 0// 测试用例4:k为0(无法调整)int[]nums4={2,7,2};System.out.println("Test 4: "+solution.smallestRangeI(nums4,0));// 5// 测试用例5:大k值int[]nums5={1,3,6};System.out.println("Test 5: "+solution.smallestRangeI(nums5,10));// 0// 测试用例6:负数int[]nums6={-1,-3,-6};System.out.println("Test 6: "+solution.smallestRangeI(nums6,2));// 0// 测试用例7:大数组int[]nums7={100,200,300,400,500};System.out.println("Test 7: "+solution.smallestRangeI(nums7,50));// 300// 测试用例8:k刚好让差值为0int[]nums8={1,5};System.out.println("Test 8: "+solution.smallestRangeI(nums8,2));// 0}

关键点

  1. 贪心策略

    • 由于每个元素可以独立调整,最优策略就是让最小值最大化,最大值最小化
    • 中间元素的调整不会影响最终的最值差
  2. 边界处理

    • minNum + k >= maxNum - k时,差值为0
    • 差值不能为负数,所以要和0取最大值
  3. 数学公式

    • max(0, maxNum - minNum - 2*k)
  4. 特殊情况

    • 单元素数组:差值恒为0
    • k=0:无法调整,返回原始差值
    • 大k值:可能让所有元素重合

常见问题

  1. 为什么不需要考虑中间元素的调整?

    • 只关心最终数组的最大值和最小值
    • 中间元素即使调整,也不会成为新的最大值或最小值(在最优策略下)
  2. 为什么是2*k而不是k

    • 同时调整了最小值(+k)和最大值(-k)
    • 总共可以减少k + k = 2*k的差值
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 10:55:12

AI+电商:快速构建基于Z-Image-Turbo的商品图生成系统

AI电商&#xff1a;快速构建基于Z-Image-Turbo的商品图生成系统 在电商运营中&#xff0c;商品展示图的质量直接影响转化率。传统拍摄方式成本高、周期长&#xff0c;尤其当需要为数千种商品批量生成展示图时&#xff0c;AI技术成为高效解决方案。本文将介绍如何利用Z-Image-Tu…

作者头像 李华
网站建设 2026/5/6 15:57:58

AI摄影棚:基于阿里通义Z-Image-Turbo的虚拟拍摄环境搭建

AI摄影棚&#xff1a;基于阿里通义Z-Image-Turbo的虚拟拍摄环境搭建 对于小型视频制作团队来说&#xff0c;专业虚拟制作解决方案的高昂成本往往令人望而却步。本文将介绍如何利用阿里通义Z-Image-Turbo搭建一个经济高效的AI虚拟摄影棚&#xff0c;帮助团队快速生成逼真背景&am…

作者头像 李华
网站建设 2026/5/9 5:52:05

【std::map】判断是否存在某个键

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录1. 使用 find 方法&#xff08;最常用&#xff09;2. 使用 count 方法&#xff08;简洁判断&#xff09;3. C20 新增的 contains 方法&#xff08;最直观&#xff09…

作者头像 李华
网站建设 2026/5/9 12:04:38

临床知识引导的混合分类网络用于X射线图像中牙周疾病的自动诊断/文献速递-基于人工智能的医学影像技术

2026.1.8本文提出HC-Net混合分类框架&#xff0c;首次以真实临床探诊结果作为金标准&#xff0c;结合牙齿和患者层面信息&#xff0c;并融入临床诊断知识&#xff0c;实现了全景X射线图像中牙周疾病的自动精准诊断&#xff0c;显著提高了诊断的敏感性和准确性。Title题目01Clin…

作者头像 李华
网站建设 2026/5/3 20:09:07

产品经理必备:10分钟了解AI图像生成技术

产品经理必备&#xff1a;10分钟了解AI图像生成技术 作为一名非技术背景的产品经理&#xff0c;你可能经常听到"Stable Diffusion"、"AI绘图"这些热词&#xff0c;但面对复杂的安装配置和GPU需求&#xff0c;往往无从下手。本文将带你快速理解AI图像生成的…

作者头像 李华