【LeetCode题解】2809. 使数组和小于等于 x 的最少时间+2788. 按分隔符拆分字符串+410. 分割数组的最大值

文章目录

        • [2809. 使数组和小于等于 x 的最少时间](https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/)
          • 思路:
        • [2788. 按分隔符拆分字符串](https://leetcode.cn/problems/split-strings-by-separator/)
          • 思路:
        • [410. 分割数组的最大值](https://leetcode.cn/problems/split-array-largest-sum/)
            • 思路:二分查找+贪心

2809. 使数组和小于等于 x 的最少时间

在这里插入图片描述

思路:
  1. 获取两个列表的长度n,并初始化一个二维数组f,用于存储最优解。
  2. 定义一个二维数组nums,用于存储输入的两个列表中的元素,并按照第二列元素进行排序。
  3. 使用动态规划的方法,通过遍历nums数组,计算最优解。其中,f[i][j]表示将前i个元素分配到j个集合中时的最大总和。通过比较f[i-1][j]和f[i-1][j-1]+a+b*j的大小,更新f[i][j]。
  4. 计算两个列表中所有元素的和,分别存储在s1和s2中。
  5. 遍历0至n的范围,判断是否满足条件s1 + s2 * j - f[n][j] <= x,若满足则返回j。
  6. 若没有满足条件的j值,则返回-1
class Solution {public int minimumTime(List<Integer> nums1, List<Integer> nums2, int x) {int n = nums1.size();int[][] f = new int[n + 1][n + 1]; // 定义二维数组f,用于存储最优解int[][] nums = new int[n][0]; // 定义二维数组nums,用于存储输入的两个列表中的元素for (int i = 0; i < n; ++i) {nums[i] = new int[] {nums1.get(i), nums2.get(i)}; // 将输入的两个列表中的元素按照相同的索引放入nums数组中}Arrays.sort(nums, Comparator.comparingInt(a -> a[1])); // 根据nums数组中第二列的元素进行排序for (int i = 1; i <= n; ++i) {for (int j = 0; j <= n; ++j) {f[i][j] = f[i - 1][j]; // 初始化f[i][j]为f[i-1][j]if (j > 0) { // 当j大于0时,进行以下操作int a = nums[i - 1][0], b = nums[i - 1][1];f[i][j] = Math.max(f[i][j], f[i - 1][j - 1] + a + b * j); // 更新f[i][j],取当前值与f[i-1][j-1]+a+b*j的较大值}}}int s1 = 0, s2 = 0;for (int v : nums1) {s1 += v; // 计算nums1列表中所有元素的和,存储在s1中}for (int v : nums2) {s2 += v; // 计算nums2列表中所有元素的和,存储在s2中}for (int j = 0; j <= n; ++j) {if (s1 + s2 * j - f[n][j] <= x) { // 判断是否满足条件 s1 + s2 * j - f[n][j] <= xreturn j; // 返回满足条件的j值}}return -1; // 若没有满足条件的j值,则返回-1}
}
2788. 按分隔符拆分字符串

在这里插入图片描述

思路:
  1. 对于每个单词,使用一个可变字符串 StringBuilder 来构建拆分后的单词。初始时,可变字符串为空。
  2. 遍历每个单词的每个字符,如果遇到指定的分隔符,就将可变字符串中的字符构成一个新的单词,并将其添加到结果列表中。然后清空可变字符串,准备构建下一个单词。
  3. 如果遇到的不是分隔符,则将当前字符添加到可变字符串中。
  4. 最后,如果可变字符串非空,则说明最后一个单词还没有添加到结果列表中,因此需要将其添加到结果列表中。
  5. 返回拆分后的结果列表。
//2788. 按分隔符拆分字符串public List<String> splitWordsBySeparator(List<String> words, char separator) {// 创建一个新的字符串列表,用于存储拆分后的结果List<String> res = new ArrayList<>();// 遍历原始字符串列表中的每个单词for (String word : words) {// 创建一个可变字符串,用于构建拆分后的单词StringBuilder sb = new StringBuilder();// 获取当前单词的长度int length = word.length();// 遍历当前单词的每个字符for (int i = 0; i < length; i++) {// 获取当前字符char c = word.charAt(i);// 如果当前字符是分隔符if (c == separator) {// 如果可变字符串不为空,则将其添加到结果列表中,并清空可变字符串if (sb.length() > 0) {res.add(sb.toString());sb.setLength(0);}} else {// 如果当前字符不是分隔符,则将其添加到可变字符串中sb.append(c);}}// 如果可变字符串不为空,则将其添加到结果列表中if (sb.length() > 0) {res.add(sb.toString());}}// 返回拆分后的字符串列表return res;}
410. 分割数组的最大值

在这里插入图片描述

思路:二分查找+贪心

利用二分查找法和贪心算法来求解将数组分割为m个非空连续子数组,使得每个子数组的和的最大值最小

  1. 首先,我们需要确定二分查找的左右边界。左边界left初始化为数组中的最大值,右边界right初始化为数组所有元素的总和。
  2. 然后,我们使用二分查找法在左右边界之间查找满足条件的最小子数组和。
  3. 在每次迭代中,我们计算中间值mid,然后调用check函数判断以mid为目标值是否能将数组nums分割成不超过m个子数组。如果能,则将右边界更新为mid,因为我们要寻找更小的子数组和。如果不能,则将左边界更新为mid + 1,因为mid不满足条件,我们需要尝试更大的值。
  4. 当左边界left不小于右边界right时,二分查找结束,最终的结果即为左边界的值。
  5. 最后,返回左边界的值作为最小子数组和。
public int splitArray(int[] nums, int m) {int left = 0, right = 0;// 初始化左右边界for (int i = 0; i < nums.length; i++) {right += nums[i];if (left < nums[i]) {left = nums[i];}}// 使用二分查找法寻找最小的子数组和while (left < right) {int mid = (right - left) / 2 + left;if (check(nums, mid, m)) {right = mid;} else {left = mid + 1;}}// 返回最小的子数组和return left;
}public boolean check(int[] nums, int x, int m) {int sum = 0;int cnt = 1;// 统计满足条件的子数组个数for (int i = 0; i < nums.length; i++) {if (sum + nums[i] > x) {// 当前元素加上之后超过了目标值,需要分割出一个新的子数组cnt++;sum = nums[i];} else {// 将当前元素加入到当前子数组中sum += nums[i];}}// 判断最终的子数组个数是否小于等于目标个数return cnt <= m;
}

check函数中,遍历数组nums,累加元素值到sum变量中,如果累加和超过了目标值x,则说明当前子数组和超过了目标值,需要分割出一个新的子数组,同时将子数组计数cnt增加1,并将sum重置为当前元素值。如果累加和未超过目标值,则将当前元素加入到当前子数组中。

最后,判断最终的子数组个数cnt是否小于等于目标个数m,如果是则返回true,否则返回false

通过不断调整二分查找的左右边界,可以找到满足条件的最小子数组和

点击移步博客主页,欢迎光临~

偷cyk的图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcoder Day36| 动态规划part03

343. 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: 10输出: 36解释: 10 3 3 4, 3 3 4 36。说明: 你可以假设 …

如何提取图片中某个位置颜色的RGB值,RGB十进制值与十六进制的转换

打开本地的画图工具&#xff0c;把图片复制或截图粘进去&#xff0c;用颜色提取器点对应的位置就可以提取了。 获取到的 RGB 值为 (66,133,244) 转化后的值为 #4285F4。 【内容拓展一】&#xff1a;RGB 十进制值与十六进制的转换 当我们从 RGB 十进制值转换为十六进制值时&a…

Yapi部署

【GO开发工程师】Yapi部署 推荐个人主页&#xff1a;席万里的个人空间 文章目录 【GO开发工程师】Yapi部署1、Yapi部署 1、Yapi部署 初始化yapi&#xff1a; git clone https://github.com/Ryan-Miao/docker-yapi.git cd docker-yapi docker-compose upyapi启动失败 1.cd进入…

粉丝福利-纯净Windows系统安装镜像下载网站

​Windows操作系统镜像文件是从微软或其他经过验证的来源下载正版操作系统安装介质的关键所在。以下是详细阐述从不同渠道获取Windows系统镜像的说明,尤其强调官方和安全的下载途径。Windows系统镜像可以从多个可靠来源下载,以下是几个推荐的选择: 微软官方网站 微软官方网…

对于《幻兽帕鲁》这样的游戏,如何优化服务器性能以提高游戏体验?

对于《幻兽帕鲁》这样的游戏&#xff0c;如何评估和优化服务器性能以提高游戏体验&#xff1f; 硬件配置优化&#xff1a;选择高性能的服务器&#xff0c;如4核16G的幻兽帕鲁服务器&#xff0c;这样可以保证有足够的计算性能和内存容量来支持游戏的运行。同时&#xff0c;考虑到…

Node.js(六)-数据库与身份认证

一 、学习目标 ◆ 能够知道如何配置MySQL数据库环境 ◆ 能够认识并使用常见的 SQL语操作数据库 ◆ 能够在Express中操作MySQL数据库 ◆ 能够了解 Session的实现原理 ◆ 能够了解JWT的实现原理 二、数据库的基本概念 1.1 什么是数据库 数据库&#xff08;database&#xff09;…

边缘计算网关的重要作用-天拓四方

随着物联网技术的迅猛发展&#xff0c;数据量的爆炸式增长对数据处理和分析提出了更高的要求。边缘计算网关作为连接物理世界和数字世界的桥梁&#xff0c;正逐渐受到各行业的重视。本文将从行业背景、功能特点以及带来的效益等方面&#xff0c;探讨边缘计算网关在当前及未来的…

备战蓝桥杯---状态压缩DP基础2之TSP问题

先来一个题衔接一下&#xff1a; 与上一题的思路差不多&#xff0c;不过这里有几点需要注意&#xff1a; 1.因为某一列的状态还与上上一行有关&#xff0c;因此我们令f[i][j][k]表示第i行状态为j,第i-1行状态为k的最大炮兵数。 因此&#xff0c;我们可以得到状态转移方程&…

成功解决git clone遇到的error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush af

成功解决git clone遇到的error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush af 问题描述解决方案 问题描述 用git的时候可能会遇到这个问题&#xff1a; (base) zhouzikang7443-8x4090-120:~/project$ git clone https://github.com/123/12…

Windows服务器:通过nginx反向代理配置HTTPS、安装SSL证书

先看下效果&#xff1a; 原来的是 http&#xff0c;配置好后 https 也能用了&#xff0c;并且显示为安全链接。 首先需要 SSL证书 。 SSL 证书是跟域名绑定的&#xff0c;还有有效期。 windows 下双击可以查看相关信息。 下载的证书是分 Apache、IIS、Tomcat 和 Nginx 的。 我…

【leetcode】圆圈中最后剩下的数字

目录 1. 问题 2. 思路 3. 代码 4. 运行 1. 问题 本题即为典型的约瑟夫问题&#xff0c;通过递推公式倒推出问题的解。原始问题是从n个人中每隔m个数踢出一个人&#xff0c;原始问题变成从n-1个人中每隔m个数踢出一个人…… 示例 1&#xff1a; 输入: n 5, m 3 输出: 3…

Unity TMP文字移动效果

前言 看见很多游戏有很特殊的波浪形文字效果&#xff0c;于是来尝试一下控制TMP文字顶点的方式达到类似效果。 原理 挂载tmp text&#xff0c;在里面随便放入非空格字符。 tmp text组件开放了textInfo接口&#xff0c;也就是GetComponent<TextMeshProUGUI>().textInfo…

两天学会微服务网关Gateway-Gateway简介

锋哥原创的微服务网关Gateway视频教程&#xff1a; Gateway微服务网关视频教程&#xff08;无废话版&#xff09;_哔哩哔哩_bilibiliGateway微服务网关视频教程&#xff08;无废话版&#xff09;共计17条视频&#xff0c;包括&#xff1a;1_Gateway简介、2_Gateway工作原理、3…

使用.NET开发VSTO工具快速将PPT导出为图片

本文主要介绍如何使用.NET开发 PowerPoint VSTO 外接程序&#xff0c;并实现快速的将当前页PPT导出为图片的功能。可以帮助你了解如何使用 VSTO 开发 Office 外接程序&#xff0c;以及如何操作 PowerPoint 的对象模型。 1. 背景 在日常的文章写作中&#xff0c;我经常使用 PPT…

JUC并发编程 深入学习Java并发编程【上】

JUC并发编程&#xff0c;深入学习Java并发编程&#xff0c;与视频每一P对应&#xff0c;全系列6w字。 P1-5 为什么学特色预备知识 进程线程概念 进程&#xff1a; 一个程序被运行&#xff0c;从磁盘加载这个程序的代码到内存&#xff0c;就开起了一个进程。 进程可以视为程…

JVM相关问题

JVM相关问题 一、Java继承时父子类的初始化顺序是怎样的&#xff1f;二、JVM类加载的双亲委派模型&#xff1f;三、JDK为什么要设计双亲委派模型&#xff0c;有什么好处&#xff1f;四、可以打破JVM双亲委派模型吗&#xff1f;如何打破JVM双亲委派模型&#xff1f;五、什么是内…

Spring Cloud Gateway-系统保护Sentinel集成

文章目录 Sentinel介绍Spring Cloud Gateway集成Sentinelpom依赖Sentinel配置Sentinel集成Nacos作为数据源自定义降级响应 Sentinel介绍 ​ 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&a…

HTML5:七天学会基础动画网页6

CSS3自定义字体 ①&#xff1a;首先需要下载所需字体 ②&#xff1a;把下载字体文件放入 font文件夹里&#xff0c;建议font文件夹与 css 和 image文件夹平级 ③&#xff1a;引入字体&#xff0c;可直接在html文件里用font-face引入字体&#xff0c;分别是字体名字和路径 例…

Django官网项目

项目准备 使用VSCODE做IDE。 检查Python版本。 sudo apt install sudo apt update python3 --version创建项目路径&#xff0c;创建虚拟环境&#xff0c;创建项目 路径 \mysite 进入路径&#xff0c;运行VSCODE 运行 "code ." 创建虚拟环境。 选择 >python: c…

【推荐算法系列十七】:GBDT+LR 排序算法

排序算法经典中的经典 参考 推荐系统之GBDTLR 极客时间 手把手带你搭建推荐系统 课程 逻辑回归&#xff08;LR&#xff09;模型 逻辑回归&#xff08;LR,Logistic Regression&#xff09;是一种传统机器学习分类模型&#xff0c;也是一种比较重要的非线性回归模型&#xff…