开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 24 天,点击查看活动详情
刷题的日常-2023年2月26号
一天一题,保持脑子清爽
有界数组中指定下标处的最大值
来自leetcode的 1802 题,题意如下:
给你三个正整数 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 。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一个 n,代表返回构造的数组长度
- 一个 index,代表数组下标,要求这个下标的值要是最大的
- 然后是 maxSum,要求构造出来的数组的总和不能超过这个值
- 返回我们能构建的数组中 index 位置最大的值
做题思路
没有好的思路,只能暴力碰出答案。我采用的是通过二分的方法对返回值进行判断,如果满足条件则往大取值,不满住则往小取值。最后将边界值找出,步骤如下。
- 开辟左右边界,小边界为 1,大边界为 最大值
- 对结果进行二分
- 对中点的值调用判断方法,这里使用的是暴力。循环分配每一个数,直到不满足条件或者分配完毕就返回。
- 如果满足分配条件,将左边界往右拉
- 如果不满足分配条件,将右边界往左拉
- 循环上面的方法,一直到左右边界重合
- 重合的点就是结果,直接返回即可。
代码实现
代码实现如下: