算法题 最小差值 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的差值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1131134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别CUDA报错:预装镜像带你轻松玩转Z-Image-Turbo

告别CUDA报错&#xff1a;预装镜像带你轻松玩转Z-Image-Turbo 作为一名计算机专业的学生&#xff0c;在课程项目中需要使用AI生成图像时&#xff0c;你是否曾被各种依赖包冲突和CUDA版本问题困扰得焦头烂额&#xff1f;本文将介绍如何通过预装好的Z-Image-Turbo镜像&#xff0c…

玩转AI绘画:周末用云端GPU打造个人艺术展

玩转AI绘画&#xff1a;周末用云端GPU打造个人艺术展 作为一名艺术爱好者&#xff0c;你是否曾想过举办一场属于自己的AI艺术展&#xff1f;借助Stable Diffusion等开源AI绘画工具&#xff0c;现在完全可以在云端GPU环境下快速生成高质量的艺术作品。本文将手把手教你如何利用预…

简析:一种名为 ObjectSense 的编程语言

让我们通过以下三个维度来了解它&#xff1a;1. 语言本质与起源 基础平台&#xff1a;它是一种基于 Vim Script (VimL) 进行面向对象封装的脚本编程语言。核心特性&#xff1a;高度精炼&#xff0c;核心代码仅在千行之内。设计初衷&#xff1a;旨在让开发者能像写 Python 一样简…

使用MATLAB绘制3D心形图和玫瑰花图案

以下是两种不同的实现方法&#xff1a; 1. 3D心形图 方法一&#xff1a;参数方程心形 % 3D心形图 - 参数方程方法 figure(Position, [100, 100, 1200, 500]);% 子图1&#xff1a;参数方程心形 subplot(1,2,1); % 创建网格 [u, v] meshgrid(linspace(0, 2*pi, 50), linspace(0,…

贴吧引流项目,积攒收录被动引流,可以自己搭配脚本操作

贴吧被动引流教程&#xff0c;长期积攒百度收录被动流量聪明的同学可以自己去定制脚本&#xff0c;让脚本帮你操作。

Z-Image-Turbo模型调优实战:免环境配置的云端实验平台

Z-Image-Turbo模型调优实战&#xff1a;免环境配置的云端实验平台 如果你是一名AI工程师&#xff0c;想要对Z-Image-Turbo进行微调实验&#xff0c;但每次尝试新参数都要处理环境问题&#xff0c;那么这篇文章正是为你准备的。Z-Image-Turbo是阿里巴巴通义实验室推出的6B参数图…

AsterNOS SONiC基于YANG模型的现代网络管理:从CLI到gNMI的演进

从“运维之困”到“模型驱动”&#xff1a;新一代网络管理的必然演进 对于许多网络运维工程师而言&#xff0c;这样的一幕或许并不陌生&#xff1a;面对成百上千台多厂商设备&#xff0c;一边在命令行中重复着繁琐的配置脚本&#xff0c;一边在监控屏幕上审视着分钟级延迟的流…

边缘计算整合:如何用云端Z-Image-Turbo环境开发混合AI绘画应用

边缘计算整合&#xff1a;如何用云端Z-Image-Turbo环境开发混合AI绘画应用 在当今AI技术快速发展的背景下&#xff0c;将云端AI能力与边缘设备相结合的混合架构正成为创新应用的热门选择。本文将详细介绍如何使用Z-Image-Turbo这一高效的AI绘画模型&#xff0c;在云端GPU环境中…

状态监测及群智能散货港口运行优化【附代码】

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅成品或者定制&#xff0c;扫描文章底部微信二维码。(1) 港口状态监测数据集成系统与卸车调度优化方法散货港口作为大宗货物转运的关键节点…

AI生成社交媒体素材:营销团队的效率革命

AI生成社交媒体素材&#xff1a;营销团队的效率革命 社交媒体运营团队每天面临的最大挑战之一&#xff0c;就是需要持续产出高质量的视觉内容。传统设计流程耗时费力&#xff0c;而AI工具的出现正在改变这一局面。本文将介绍如何利用Stable Diffusion等开源模型快速生成可商用的…

AI时尚预测:下一季流行色的智能生成与分析

AI时尚预测&#xff1a;下一季流行色的智能生成与分析 前言&#xff1a;当服装设计遇上AI 作为一名服装设计专业的学生&#xff0c;你是否曾为预测下一季流行色而苦恼&#xff1f;传统的色彩趋势分析需要大量市场调研和历史数据比对&#xff0c;耗时耗力。而现在&#xff0c;借…

国产GIS替代,BigemapPro2025年完美收官!

在国土、测绘、环保、城市规划等众多领域中&#xff0c;专业地图软件是工作高效推进的重要工具。 Bigemap Pro 作为一款国产专业级GIS平台&#xff0c;以 “简单、高效、安全” 为核心理念&#xff0c;支持200数据格式、具备百TB级数据处理能力&#xff0c;已服务于20余个行业…

CATIA订阅授权与传统授权模式对比分析

CATIA订阅授权与传统授权模式对比分析&#xff1a;企业如何选择更高效的产品管理模式开头&#xff1a;为什么你的CATIA授权问题总在上班前就出现了&#xff1f; 作为一家使用CATIA进行产品设计和研发的制造业企业&#xff0c;在授权管理方面常常遇到一些“令人头疼”的问题。比…

Z-Image-Turbo极速体验:无需等待的AI图像生成方案

Z-Image-Turbo极速体验&#xff1a;无需等待的AI图像生成方案 在电商促销活动中&#xff0c;产品场景图的快速生成是一个关键需求。传统渲染方式往往需要数小时甚至更长时间&#xff0c;而Z-Image-Turbo提供了亚秒级的图像生成解决方案。本文将详细介绍如何使用这个高效的AI图像…

Z-Image-Turbo移动端适配:云端渲染+本地展示的混合架构

Z-Image-Turbo移动端适配&#xff1a;云端渲染本地展示的混合架构 为什么需要云端渲染本地展示的混合架构 作为一名移动应用开发者&#xff0c;你可能遇到过这样的困境&#xff1a;想在APP中集成AI图像生成功能&#xff0c;但移动设备的算力有限&#xff0c;无法流畅运行复杂的…

2026年选型指南:企业级AI agent开发平台,为什么成为CIO首要关注的技术战略?

在数字化转型进入深水区的今天&#xff0c;单纯的自动化工具已无法满足企业对智能化升级的需求。一个能感知、决策、行动并持续学习的数字员工体系&#xff0c;正成为企业新的核心竞争力。这推动着企业级AI agent开发平台迅速从技术概念走向战略核心&#xff0c;成为CIO和技术决…

无障碍体验:为视障人士适配阿里通义Z-Image-Turbo WebUI界面

无障碍体验&#xff1a;为视障人士适配阿里通义Z-Image-Turbo WebUI界面 作为一名长期关注无障碍设计的技术从业者&#xff0c;我最近尝试了阿里通义Z-Image-Turbo这款AI图像生成工具。虽然它的生成效果令人惊艳&#xff0c;但默认的WebUI界面对于视障用户来说存在诸多不便。本…

从手动统计到自动化:企业AutoCAD许可管理进化史

从手动统计到自动化&#xff1a;企业AutoCAD许可管理进化史开篇&#xff1a;你还在手动统计AutoCAD许可证吗&#xff1f;作为一名长期从事企业IT管理和软件资产管理的从业者&#xff0c;我经常会听到企业管理者抱怨&#xff1a;“我们的AutoCAD许可管理太麻烦了&#xff0c;不仅…

Python 基础语法完全指南:变量、类型、运算符与输入输出(零基础入门)

Python 基础语法完全指南&#xff1a;变量、类型、运算符与输入输出&#xff08;零基础入门&#xff09; 大家好&#xff01;欢迎来到 Python 零基础学习之旅的第一站。今天我们从最最基础的内容开始——变量、数据类型、运算符和输入输出。这些是 Python 的“地基”&#xff…

阿里通义Z-Image-Turbo WebUI批量处理教程:高效生成海量图像

阿里通义Z-Image-Turbo WebUI批量处理教程&#xff1a;高效生成海量图像 如果你是一位电商运营人员&#xff0c;需要为数千种商品生成展示图片&#xff0c;手动操作效率极低。那么阿里通义Z-Image-Turbo WebUI的批量处理功能就是你的救星。本文将详细介绍如何使用这个强大的AI工…