Leetcode1891:割绳子

题目描述:

给定一个整数数组 ribbons 和一个整数 k,数组每项 ribbons[i] 表示第 i 条绳子的长度。对于每条绳子,你可以将任意切割成一系列长度为 正整数的部分,或者选择不进行切割。

例如,如果给你一条长度为 4 的绳子,你可以:

  • 保持绳子的长度为 4 不变;
  • 切割成一条长度为 3 和一条长度为 1 的绳子;
  • 切割成两条长度为 2 的绳子;
  • 切割成一条长度为 2 和两条长度为 1 的绳子;
  • 切割成四条长度为 1 的绳子。

你的任务是找出最大 x 值,要求满足可以裁切出至少 k 条长度均为 x 的绳子。你可以丢弃裁切后剩余的任意长度的绳子。如果不可能切割出 k 条相同长度的绳子,返回 0。

示例 1:

复制代码
输入: ribbons = [9,7,5], k = 3
输出: 5
解释:
- 把第一条绳子切成两部分,一条长度为 5,一条长度为 4;
- 把第二条绳子切成两部分,一条长度为 5,一条长度为 2;
- 第三条绳子不进行切割;
现在,你得到了 3 条长度为 5 的绳子。

示例 2:

复制代码
输入: ribbons = [7,5,9], k = 4
输出: 4
解释:
- 把第一条绳子切成两部分,一条长度为 4,一条长度为 3;
- 把第二条绳子切成两部分,一条长度为 4,一条长度为 1;
- 把第二条绳子切成三部分,一条长度为 4,一条长度为 4,还有一条长度为 1;
现在,你得到了 4 条长度为 4 的绳子。

示例 3:

复制代码
输入: ribbons = [5,7,9], k = 22
输出: 0
解释: 由于绳子长度需要为正整数,你无法得到 22 条长度相同的绳子。

提示:

  • 1 <= ribbons.length <= 10^5
  • 1 <= ribbons[i] <= 10^5
  • 1 <= k <= 10^9

直接上代码:

java 复制代码
class Solution {
    public int maxLength(int[] ribbons, int k) {
        //绳子的总长度
        int sum = 0;
        //找到当前绳子的最大长度
        int max = 0;
        //是否大于等于k,这个一定要记录,因为如果比较sum可能会出现Integer越界变成负的
        boolean isOverK = false;
        for(int ribbon : ribbons) {
            sum += ribbon;
            if(!isOverK && sum >= k) {
                isOverK = true;
            }
            max = Math.max(ribbon, max);
        }
        if(!isOverK) {
            return 0;
        }
        
        //二分进行尝试
        int start = 1;
        int end = max;
        //定义结果,当然最小可以分割为1的
        int ans = 1;
        while(start <= end) {
            int mid = start + (end - start) / 2;
            int num = getNumOfRibbons(ribbons, mid);
            if(num < k) {
                //说明切割长度太大了,从start~mid-1范围尝试
                end = mid - 1;
            } else {
                ans = Math.max(ans, mid);
                //但是还需要尝试更大的
                start = mid + 1;
            }
        }
        return ans;
    }

    /**尝试一下切割成length长度可以切出至少多少条绳子 */
    public int getNumOfRibbons(int[] ribbons, int length) {
        int ans = 0;
        for(int ribbon : ribbons) {
            ans += ribbon / length;
        }
        return ans;
    }
}

运行结果:

时间比较紧急,不卷优化了,后期再说吧,先保过

相关推荐
啊森要自信2 分钟前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
仟濹25 分钟前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事28 分钟前
简单模板笔记
数据结构·笔记·算法
YuTaoShao43 分钟前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头1 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
goodluckyaa1 小时前
LCR 006. 两数之和 II - 输入有序数组
算法
孤狼warrior1 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Σίσυφος19001 小时前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
xhbaitxl1 小时前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL2 小时前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试