持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
力扣第 89 场双周赛
力扣第 89 场双周赛-力扣
a了两题,居然还有1000多名,第三题居然是二分做完之后发现了,就算做出来也只能上小百名把 唉,,,,
2439. 最小化数组中的最大值
给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。
每一步操作中,你需要:
选择一个满足 1 <= i < n 的整数 i ,且 nums[i] > 0 。 将 nums[i] 减 1 。 将 nums[i - 1] 加 1 。 你可以对数组执行 任意 次上述操作,请你返回可以得到的 nums 数组中 最大值 最小 为多少。
示例 1
- 输入:nums = [3,7,1,6]
- 输出:5
- 解释:
- 一串最优操作是:
-
- 选择 i = 1 ,nums 变为 [4,6,1,6] 。
-
- 选择 i = 3 ,nums 变为 [4,6,2,5] 。
-
- 选择 i = 1 ,nums 变为 [5,5,2,5] 。
- nums 中最大值为 5 。无法得到比 5 更小的最大值。
- 所以我们返回 5 。
示例
- 输入: nums = [10,1]
- 输出: 10
- 解释:
- 最优解是不改动 nums ,10 是最大值,所以返回 10 。
提示
n == nums.length2 <= n <= 1050 <= nums[i] <= 109
代码
一眼二分的题居然没想到,做完了上床看评论说使用二分做,然后用ipad硬是写出来,真心不难,可是比赛的时候想不出来!!
class Solution {
public int minimizeArrayValue(int[] nums) {
int max = 0;
for(int i=0;i<nums.length;i++){
max =Math.max(max,nums[i]);
}
int l = nums[0];
int r = max;
while(l < r){
int mid = l+r >>1;
if(fun(mid, nums)) {
r = mid;
}else {
l = mid + 1;
}
}
return l;
}
public boolean fun(int mid, int[] arr){
long sum = 0;
for(int i = arr.length -1;i >0;i--){
sum = sum + arr[i] - mid;
if(sum < 0) {
sum =0;
}
}
return sum + arr[0] <= mid;
}
}
3.结束
现在三题都有时候做不出来了,可真是难受,再就是第四题还是无从下手,我什么时候能成为四题选手啊!!!!gogogo,刷题刷题,每天一道,三年1000道!!!!