首页 > 其他分享 >410. 分割数组的最大值(leetcode)

410. 分割数组的最大值(leetcode)

时间:2024-09-26 17:34:27浏览次数:1  
标签:nums int max 最大值 mid 段数 410 leetcode

https://leetcode.cn/problems/split-array-largest-sum/description/

比较难的二分,关键点在于看出二段性,段数越多最大值越小,段数越小最大值越大,二分最大值,然后就是最大值的合法性校验(判断段数<=k),用于二分的check

class Solution {

 

    public int splitArray(int[] nums, int k) {
        // 由于k越小,最大值越大,k越大,最大值越小
        // 有二段性,单调,可以使用二分,二分最大值应该是多少
        
        int max = 0;
        int sum = 0;

        // 计算子数组各自的和的最大值的上下界
        for (int num : nums) {
            max = Math.max(max, num);
            sum += num;
        }

        // 寻找splits<=k,最大和是多少,即lowerBound(target+1)-1
        int l=max,r=sum;
        while(l<=r)
        {
            int mid= l + (r - l >> 1);
            int splits = split(nums,mid); // 尝试按照最大和为mid,来划分,看能划分出多少段
            if(splits > k)  // 大于k意味着mid过小,段数过多
                l=mid+1; // [mid+1,right]合法
            else            // mid过小
                r=mid-1; 
        }
        return l;
    }


    // 返回nums按照最大和为maxSum,最多能划分出多少段
    int split(int[] nums,int maxSum)
    {
        // 最少为1段
        int res=1;
        int tempSum=0;
        for(int i=0;i<nums.length;i++)
        {
            // 划分出一段
            if(tempSum + nums[i] > maxSum)
            {
                tempSum=0;
                res++;
            }
            tempSum+=nums[i];
        }
        return res;
    }
        

}

 

标签:nums,int,max,最大值,mid,段数,410,leetcode
From: https://www.cnblogs.com/lxl-233/p/18433856

相关文章

  • 【leetcode】2. 两数相加
      总体思路:1.将两个链表里的数字相加:总左往右加,存入第三方链表L3里;2.设置一个进位符t,用来存储每位相加的进位信息;3.对多出来单独的链表进行处理(只需考虑进位),接入到L3的后面。/***Definitionforsingly-linkedlist.*structListNode{*intval;*s......
  • 【LeetCode Hot 100】20. 有效的括号
    题目描述这个题目在讲解栈的应用的时候是常用的例子,在遍历括号串的时候维护一个栈结构,如果当前字符是前括号,暂时没有与之配对的后括号,则先将其压入栈中。C++STL和Java都提供了对应的容器,但是由于我们知道栈的大小不可能超过括号串的长度,所以也可以手动用数组模拟,这样运行速度可......
  • leetcode每日一题day15(24.9.25)——公司命名
    思路:首先如果没有相同的后缀,则无论只要不是相同的首字母交换都不会出现重复情况,如果有重复后缀,则还需多增加个不能和,首字符与另一相同后缀字串的首字符相同的字串交换。主要矛盾已经明确,则可对矛盾进行分析。首先把范围缩小到只有两种不同首字母,对于这种情况      ......
  • Leetcode 622. 设计循环队列
    1.题目基本信息1.1.题目描述设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列......
  • Leetcode 706. 设计哈希映射
    1.题目基本信息1.1.题目描述不使用任何内建的哈希表库设计一个哈希映射(HashMap)。实现MyHashMap类:MyHashMap()用空映射初始化对象voidput(intkey,intvalue)向HashMap插入一个键值对(key,value)。如果key已经存在于映射中,则更新其对应的值value。intget(in......
  • 【算法题】63. 不同路径 II-力扣(LeetCode)-”如果起点有障碍物,那么便到不了终点“
    【算法题】63.不同路径II-力扣(LeetCode)-”如果起点有障碍物,那么便到不了终点“1.题目下方是力扣官方题目的地址63.不同路径II一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格......
  • 【LeetCode Hot 100】19. 删除链表的倒数第N个结点
    题目描述由于单向链表只能从头往后遍历,所以无法向数组那样的随机存取结构一样进行下标运算,也无法从链表尾向前数n个结点。本题有两个思路,个人觉得都比较简单。可以先遍历一遍链表得到链表的长度len,然后再从头往后数len-n个结点就是所求结点。可以使用快慢指针,快指针先移动n......
  • Leetcode 626-换座位题目解析
    1.题目编写解决方案来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。按 id 升序 返回结果表。 2.数据准备CreatetableIfNotExistsSeat(idint,studentvarchar(255));TruncatetableSeat;insertintoSeat(id,student)v......
  • 求10 个整数中最大值
    我们需要10个整数之中求出10个整数之中的最大值所以我们先要将10个整数先放置到一个容器之中,我们初期就使用数组的形式存放10个数组即设置数组arr[10],我们要将10个数组之中的数字输出出来,我们这里使用的是遍历循环输出数组。我们这里是使用的是一个基本的数学公式sz=sizeof(a......
  • Leetcode 1472. 设计浏览器历史记录
    1.题目基本信息1.1.题目描述你有一个只支持单个标签页的浏览器,最开始你浏览的网页是homepage,你可以访问其他的网站url,也可以在浏览历史中后退steps步或前进steps步。请你实现BrowserHistory类:BrowserHistory(stringhomepage),用homepage初始化浏览器类。void......