首页 > 其他分享 >二分搜索应用 II

二分搜索应用 II

时间:2024-01-21 20:55:51浏览次数:39  
标签:二分 nums int sum II 搜索 数组 2.1 最大值

目录

1. 题目列表

序号 题目 难度
1 410. 分割数组的最大值 困难

2. 应用

2.1. Leetcode 410. 分割数组的最大值

2.1.1. 题目

410. 分割数组的最大值

给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。
设计一个算法使得这 k 个子数组各自和的最大值最小。

示例 1:

输入:nums = [7,2,5,10,8], k = 2
输出:18
解释:
一共有四种方法将 nums 分割为 2 个子数组。其中最好的方式是将其分为 [7,2,5] 和 [10,8] 。因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。

2.1.2. 解题思路

2.1.3. 代码实现

class Solution {
    public int splitArray(int[] nums, int k) {
        int sum = 0;
        int maxNum = 0;
        for (int num : nums) {
            sum += num;
            maxNum = Math.max(maxNum, num);
        }
        // 二分查找的区间
        int left = Math.max(maxNum - 1, (sum - 1) / k); // 最小值:分成多段,每段最少不小于最大值和平均值
        int right = sum; // 最大值:分成一段,就是sum
        while (left + 1 < right) {
            int mid = left + (right - left) / 2;
            if (check(nums, k, mid)) {
                right = mid;
            } else {
                left = mid;
            }
        }
        return right;
    }

    private boolean check(int[] nums, int k, int target) {
        int count = 1;
        int sum = 0;
        // 计算这样分,最多可以分多少段
        for (int num : nums) {
            if (sum + num <= target) {
                sum += num;
            } else {
                if (count == k) {
                    return false;
                }
                // 新划分一段
                count += 1;
                // 并重新计算这一段的和
                sum = num;
            }
        }
        return true;
    }
}

标签:二分,nums,int,sum,II,搜索,数组,2.1,最大值
From: https://www.cnblogs.com/larry1024/p/17978345

相关文章

  • Visual Studio实用的搜索、查找、替换技巧
    前言对于.NET开发者而言VisualStudio是我们日常工作中比较常用的开发工具,掌握一些VisualStudio实用的搜索、查找、替换技巧可以帮助我们大大提高工作效率从而避免996。VisualStudio更多实用技巧https://github.com/YSGStudyHards/DotNetGuide代码和功能搜索(Ctrl+T)Ctr......
  • P10073 [GDKOI2024 普及组] 刷野 II 的题解
    P10073[GDKOI2024普及组]刷野II的题解谨以此篇题解记录我考场上唯一通过的一题~解题思路可以考虑定义两个指针x和y,分别为左侧攻击到哪里和右侧。此时,从两侧线性想中间递推,若先打左边的代价小就打左边的,否则就打右边的。按照这个方法向中间推就可以了。Code#include<......
  • 【LeetCode】704. 二分查找
    题目:704.二分查找解题思路思路:给定一个nums数组,注意数组是升序排列的;那么,找到当前target元素是否存在于数组之中,可采用二分法查找注意:此处定义该数组区间定义:【左闭右闭】/【左闭右开】使用left指向数组头,right指针指向数组尾,mid用于计算二分查找的位置,mid=left+(ri......
  • Perplexity AI:给搜索引擎注入了新的生命力
    Ai工具集导航(Ai-321.com)新时代的互联网世界中,搜索引擎被誉为“王冠顶上的明珠”。毕竟,百度和谷歌这两大巨头在两岸三地都享有举足轻重的地位。然而,随着AI大模型的崛起,AI赋能搜索引擎已经成为业界的新潮流。国内市场上,昆仑万维的天工AI搜索成为瞩目的新秀;而在海外,则有AI搜索初创公司......
  • 《Java 核心技术·卷 II(原书第 11 版):高级特性》PDF
    内容简介本书针对Java11进行了修订,涵盖了完整的对高级UI特性、企业编程、网络、安全和Java强大的模块系统等内容的讨论。书中对Java复杂的新特性进行了深入而全面的研究,展示了如何使用它们来构建具有专业品质的应用程序,作者所设计的经过全面完整测试的示例反映了当今的Ja......
  • 31_修剪二叉搜索树
    669.修剪二叉搜索树给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树不应该改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在唯一的答案。所......
  • 30_删除二叉搜索树中的节点
    450.删除二叉搜索树中的节点给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例1:......
  • BZOJ1717 Milk Patterns 产奶的模式 (二分+后缀数组+height数组)
    发现这样起标题更能引流(ylg实锤了)题意给定一个长度为\(n\)的数组\(a\),求在\(a\)中出现了至少\(k\)次的最长子串的长度。解法考虑将一个子串拆成两个后缀,即\([l,r]=[l,n]-[r,n]\),发现一个长度为\(x\)的子串\(t\)在\(i,j\)两个位置出现过当且仅当后缀\(i,j\)有......
  • 搜索习题汇总
    搜索习题汇总1.[USACO1.4][IOI1994]时钟TheClocks题目描述考虑将如此安排在一个\(3\times3\)行列中的九个时钟:|-------||-------||-------|||||||||---o||---o||o||||||||-------......
  • STIX/TAXII?威胁情报领域
     指标信息的可信自动化交换(TrustedAutomatedeXchangeofIndicatorInformation,TAXII)TAXII(TrustedAutomatedeXchangeofIndicatorInformation)是一个信息交换的标准,用于跨产品、服务和组织边界来共享网络威胁信息。它是STIX结构化威胁信息的传输工具。 结构化威胁......