刷题的日常-有界数组中指定下标处的最大值

73 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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,大边界为 最大值
  • 对结果进行二分
  • 对中点的值调用判断方法,这里使用的是暴力。循环分配每一个数,直到不满足条件或者分配完毕就返回。
  • 如果满足分配条件,将左边界往右拉
  • 如果不满足分配条件,将右边界往左拉
  • 循环上面的方法,一直到左右边界重合
  • 重合的点就是结果,直接返回即可。

代码实现

代码实现如下: image.png

image.png