[杨小白]_leetcode_力扣第 89 场双周赛-第三题

79 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

力扣第 89 场双周赛

力扣第 89 场双周赛-力扣

a了两题,居然还有1000多名,第三题居然是二分做完之后发现了,就算做出来也只能上小百名把 唉,,,,

image.png

image.png

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
  • 解释:
  • 一串最优操作是:
    1. 选择 i = 1 ,nums 变为 [4,6,1,6] 。
    1. 选择 i = 3 ,nums 变为 [4,6,2,5] 。
    1. 选择 i = 1 ,nums 变为 [5,5,2,5] 。
  • nums 中最大值为 5 。无法得到比 5 更小的最大值。
  • 所以我们返回 5 。

示例

  • 输入: nums = [10,1]
  • 输出: 10
  • 解释:
  • 最优解是不改动 nums ,10 是最大值,所以返回 10 。

提示

  • n == nums.length
  • 2 <= n <= 105
  • 0 <= nums[i] <= 109

代码

image.png

一眼二分的题居然没想到,做完了上床看评论说使用二分做,然后用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道!!!!