Re: [闲聊] 每日LeetCode

楼主: Rushia (みけねこ的鼻屎)   2023-06-11 00:14:46
https://leetcode.com/problems/maximum-value-at-a-given-index-in-a-bounded-array/description/
1802. Maximum Value at a Given Index in a Bounded Array
给你三个数字n, index, maxSum,我们必须找出一个阵列 nums 满足:
1.阵列大小为n
2.阵列所有元素之和小于maxSum
3.nums[i] 和 nums[i + 1] 相差不多于1
4.nums[index] 的大小尽可能大
5.nums[i] >= 1
Example 1:
Input: n = 4, index = 2, maxSum = 6
Output: 2
Explanation: nums = [1,2,2,1] is one array that satisfies all the conditions.
There are no arrays that satisfy all the conditions and have nums[2] == 3, so
2 is the maximum nums[2].
Example 2:
Input: n = 6, index = 1, maxSum = 10
Output: 3
思路:
1.因为nums[index]要尽可能大,他的值可能是 0 ~ maxSum,在一定的范围中找满足条件
的最大值我们可以使用二分搜索。
2.mid 是中间和,我们判断他的左边和右边的阵列和相加之后是否小于等于 maxSum,
我们需要一个方法可以快速的求和。
3.因为中间要尽可能大又不能超过maxSum,所以旁边必须要尽可能小,为了满足连续的元
素要相差不为1,中心点左右两边的阵列值必定会是一个越往左(右) 越递减的数列,
递减到1之后后面都会是1(例如:5, 4, 3, ..., 1, 1, 1)。
可以分成两个情况:
一、mid的值大于元素个数n:可以用求和公式快速找出范围内的和
sum = (mid - n + mid) * n / 2
二、mid的值小于元素个数n:部分和用求和公式,剩下的元素全补1
sum = (mid + 1) * mid / 2 + n - mid
4.每次依照sum判断当前的值是否不会超出maxSum,往左边界二分查找,这边求
mid的时候要额外 + 1,否则当范围值为偶数时会无穷循环,例如:
left = 8, right = 10;
(left + right)/2 = 8;
5.返回左边界。
Java Code:
作者: DDFox (冒险者兼清洁工)   2023-06-11 00:20:00
大师
作者: JIWP (JIWP)   2023-06-11 00:24:00
大师
作者: Che31128 (justjoke)   2023-06-11 00:27:00
大师
作者: a9486l (a9486l)   2023-06-11 01:13:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com