【二分查找】有界数组中指定下标处的最大值

news2024/12/26 0:48:23

题目描述

给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums(下标 从 0 开始 计数):

  • nums.length == n
  • nums[i] 是 正整数 ,其中 0 <= i < n
  • abs(nums[i] - nums[i+1]) <= 1 ,其中 0 <= i < n-1
  • nums 中所有元素之和不超过 maxSum
  • nums[index] 的值被 最大化

返回你所构造的数组中的 nums[index] 。

注意:abs(x) 等于 x 的前提是 x >= 0 ;否则,abs(x) 等于 -x 。

示例 1:

输入:n = 4, index = 2,  maxSum = 6
输出:2
解释:数组 [1,1,2,1] 和 [1,2,2,1] 满足所有条件。不存在其他在指定下标处具有更大值的有效数组。

解题思路

这道题一开始直接用暴力解决方案,定义一个变量h, 从1到maxSum;如果满足条件则 max = h> max ? h : max 

这个思路一定能解决上述问题,但是时间复杂度是O(maxSum);

由于整个h值不断递增,并且最大是maxSum,这里可以使用二分查找:

  1. 准备left 和 right ,用于二分查找
  2. 在left < right的情况执行下面的逻辑
    1. 计算mid = (left+right+1)/2; 这个操作一定保证mid是不断上涨的
    2. 然后计算mid是否合法,如果合法则left=mid;否则right=mid - 1
  3. 最后返回left

代码实现

package main

func maxValue(n int, index int, maxSum int) int {

	// left建议用1,不要用0
	left := 1
	right := maxSum

	for left < right {

		// 这个地方没想明白,为啥要加+1才OK
		// left = 2
		// right = 3
		// mid = (right+left)/2=2
		// mid = (right+left+1)/2 = 3
		// 这样才能避免死循环

		mid := (right + left + 1) / 2

		if valid(mid, maxSum, index, n) {
			left = mid
		} else {
			right = mid - 1
		}
	}
	return left
}

func valid(h int, maxSum int, index int, n int) bool {
	sum := cal(h, 0, index-1) + cal(h, index+1, n-1) + h
	return sum <= maxSum
}

func cal(h int, start int, end int) int {
	if start > end {
		return 0
	}

	if (h - 1) > (end - start + 1) {
		return (end - start + 1) * (h - 1 + (h - (end - start + 1))) / 2
	} else {
		return (h)*(h-1)/2 + ((end - start + 1) - (h - 1))
	}

}

func main() {

}

总结

这道题一开始我没有读懂题目,后续看题解才明白要解决啥问题;整体实现上直接使用二分查找就能解决;最近在学golang,所以代码实现也切换成golang;代码执行效果如下:

 

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

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

相关文章

leetcode 2244. Minimum Rounds to Complete All Tasks(完成所有task至少要多少轮)

tasks数组里面的数字表示难度的等级&#xff0c;每一轮只能完成2 或者 3个同等级的task, 问至少需要多少轮能完成所有的task, 不能完成的返回-1. 思路&#xff1a; 先来看下什么情况下不能完成。 由于一轮只能完成2 或 3个&#xff0c;那如果该等级的task只有一个呢&#xff…

P1-- 信号--通讯原理

前言&#xff1a; 最近看了《无线系统设计与国际标准》后面的几个核心技术 OFDM,Modulation&#xff0c;格雷码&#xff0c;MIMO 等技术&#xff0c;其底层的数学思想主要包括傅里叶变换 &#xff0c;狄拉克函数&#xff0c;卷积&#xff0c;线性代数基础运算。 这边结合 北京…

Electron开发-从推门到进门

一、Electron 的介绍 Electron是利用web前端技术进行桌面应用开发的一套框架。是由 github 开发的开源框架&#xff0c;允许开发者使用 Web 技术构建跨平台的桌面应用&#xff0c;它的基本结构&#xff1a; Electron Chromium Node.js Native API Chromium&#xff1a;为 …

大数据挖掘-伤寒论和金匮要略(COVID-19用药启示录)

来自Toby老师&#xff0c;大数据挖掘-伤寒论和金匮要略 大家好&#xff0c;我是Toby老师&#xff0c;三年来新冠病毒肆虐全球&#xff0c;带来一些列症状&#xff0c;例如发热&#xff0c;恶寒&#xff0c;咳嗽&#xff0c;咽喉痛&#xff0c;腹泻&#xff0c;心脑血管疾病等等…

最低成本尝试做游戏的方式

本文首发于微信公众号&#xff1a;小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。如果说有 100 个人想过去做游戏的话&#xff0c;那么最终大概只有不到 20 个人真的去尝试了&…

【TypeScript】TS类型断言-类型的声明和转换(五)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

echartjs 实现 cross (十星辅助线)跟随吸附高亮点

前言 项目是金融项目&#xff0c;就像支付宝基金的走势图一样。但图表库使用的是 echart 而不是 antv 的 f2&#xff0c;要问为什么不直接用 f2 &#xff1f;问就是因为项目历史包袱。 背景 了解过 echart 的都知道&#xff0c;官方提供了十星辅助线&#xff0c;只要设置 ax…

服务端渲染和客户端渲染

介绍 服务端渲染 servlet开发 浏览器请求servlet&#xff0c;servlet在服务端生成html 响应给浏览器&#xff0c;浏览器展示html的内容&#xff0c;这个过程就是服务端渲染。 输入url——>请求到tomcat——Servlet / jsp来解析解析用户请求并处理——>服务端渲染生成ht…

收藏网页版小游戏:蜘蛛纸牌、扫雷、水果忍者、打地鼠、吃豆人

学习之余当然是摸鱼了&#xff0c;这里分享几个不用下载直接在线玩耍的游戏。有蜘蛛纸牌网页版在线玩、在线扫雷小游戏、在线玩的水果忍者、吃豆人、打地鼠、3D模仿。 下面我将一个个列出来。欢迎体验收藏&#xff01; 蜘蛛纸牌&#xff1a;这是一款刺激好玩的棋牌小游戏。大家…

【C语言航路】第九站:数据的存储

目录 一、数据类型介绍 1.基本的内置数据类型 2.类型的基本归类 二、整型在内存中的存储 1.原码反码补码 2.大端字节序与小端字节序 3.一些经典的题目 三、浮点型在内存中的存储 总结 一、数据类型介绍 1.基本的内置数据类型 这部分我们在一开始的时候已经说过了&…

中职组网络安全2022年安徽省赛信息隐藏与探索

首先这一套题目我们先看一下环境: 以上来给到了一个主页的网站,做这样的题目我们第一个想到的就是源代码,于是我们查找源代码看看里边有什么东西: 在contact.php中发现了flag1,但是这一看就是一个base64代码,我们将其进行解密:

华脉智联可视化指挥调度系统

华脉智联可视化指挥调度系统&#xff0c;多端一体化综合智能指挥调度平台&#xff0c;可以实现对各级人员、设备、系统统一指挥&#xff0c;应急调度&#xff0c;为行业应用提供可视化智能指挥调度系统解决方案。 1、可视化指挥调度系统介绍 可视化指挥调度系统基于现有的4G通信…

处理WM_KILLFOCUS消息时需要注意的地方

之前我在一篇文章中曾经提过&#xff0c;不应该利用 WM_KILLFOCUS 消息中对表单的字段进行有效性校验。 今天的文章&#xff0c;我将介绍另外一个反面例子&#xff0c;来表现当使用 WM_KILLFOCUS 消息处理焦点相关的问题时所带来的混乱。 假设&#xff0c;有一个编辑框控件使用…

编写 MBR 主引导记录

文章目录前言mbs.S代码实验操作前言 本博客记录《操作系统真象还原》第二章最后一节的实验操作~ 实验需要安装Bochs软件&#xff0c;具体可食用Bochs下载安装博客。 实验环境&#xff1a;ubuntu18.04VMware 实验内容&#xff1a;在屏幕上打印字符串“1 MBR”&#xff0c;背…

C进阶_C语言_指针进阶_C语言指针进阶

除了自己的无知&#xff0c;我什么都不懂。 ——苏格拉底 *此博客为进阶指针详解&#xff0c;需要有一定的初阶指针基础。 我们知道&#xff0c;指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节。在32位平台上是…

003-Ensp-实验-配置DHCP

实验要求 1. 根据网络结构开DHCP服务&#xff0c;使PC1 / PC2 自动获取IP地址并可以互Ping 网络结构 实验步骤 1. 配置AR2路由器g0/0/0接口IP&#xff0c;开启DHCP <Huawei>system-view [Huawei]dhcp enable [Huawei]interface g0/0/0 [Huawei-GigabitEthernet0/0/0]…

公司变更名称很麻烦吗?来来来,心周小编教你小技巧

我们都知道&#xff0c;公司如果拥有一个好的名字&#xff0c;对公司的推广会带来很大的便利&#xff0c;让客户更容易记住公司&#xff0c;记住公司的产品及相关性能&#xff0c;比如奥迪汽车公司&#xff0c;大家能一下子想到奥迪车&#xff0c;想到奥迪车的设计&#xff0c;…

UG/NX二开Siemens官方实例解析 4.3 EX_Curve_CreateSpline(创建样条曲线)

前言本系列文章主要讲解NXOpen UF API&#xff08;简称ufun函数&#xff09;的使用&#xff0c;之前看教学视频大都建议用ufun进行开发&#xff0c;这里西门子官方还专门给了一套系列文章来讲&#xff0c;说明官方也是特别推崇ufun。本人从事二开也有一段时间了&#xff0c;我的…

EasyCRM V5客户关系管理系统源码,全功能全插件带手机版无加密开源版,集成OA系统

这个是Easycrm v5最新版本&#xff0c;程序代码全部大量重写&#xff0c;运行效率提升100倍。轻松负载500w以上数据量。 代码全部明文开源&#xff0c;便于二次开发和部署。 网上其他地方的版本都是很遗憾的告诉你&#xff0c;没有手机版&#xff0c;没有财务管理等功能插件。…

【Unity3D编辑器扩展】Unity3D中实现UI界面控制,UI界面的显示和隐藏实现

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;可能遇到管理…