【LeetCode: 2811. 判断是否能拆分数组】

news2024/12/24 8:33:48

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力法
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 2811. 判断是否能拆分数组

⛲ 题目描述

给你一个长度为 n 的数组 nums 和一个整数 m 。请你判断能否执行一系列操作,将数组拆分成 n 个 非空 数组。

在每一步操作中,你可以选择一个 长度至少为 2 的现有数组(之前步骤的结果) 并将其拆分成 2 个子数组,而得到的 每个 子数组,至少 需要满足以下条件之一:

子数组的长度为 1 ,或者
子数组元素之和 大于或等于 m 。
如果你可以将给定数组拆分成 n 个满足要求的数组,返回 true ;否则,返回 false 。

注意:子数组是数组中的一个连续非空元素序列。

示例 1:

输入:nums = [2, 2, 1], m = 4
输出:true
解释:
第 1 步,将数组 nums 拆分成 [2, 2] 和 [1] 。
第 2 步,将数组 [2, 2] 拆分成 [2] 和 [2] 。
因此,答案为 true 。
示例 2:

输入:nums = [2, 1, 3], m = 5
输出:false
解释:
存在两种不同的拆分方法:
第 1 种,将数组 nums 拆分成 [2, 1] 和 [3] 。
第 2 种,将数组 nums 拆分成 [2] 和 [1, 3] 。
然而,这两种方法都不满足题意。因此,答案为 false 。
示例 3:

输入:nums = [2, 3, 3, 2, 3], m = 6
输出:true
解释:
第 1 步,将数组 nums 拆分成 [2, 3, 3, 2] 和 [3] 。
第 2 步,将数组 [2, 3, 3, 2] 拆分成 [2, 3, 3] 和 [2] 。
第 3 步,将数组 [2, 3, 3] 拆分成 [2] 和 [3, 3] 。
第 4 步,将数组 [3, 3] 拆分成 [3] 和 [3] 。
因此,答案为 true 。

提示:

1 <= n == nums.length <= 100
1 <= nums[i] <= 100
1 <= m <= 200

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路

  1. 这个题目的主要求解思路:枚举每次拆分的边界,去判断左部分和有部分是否满足题目给定的俩个限定条件,如果满足,继续递归,继续判断,如果不满足,直接结束,直到得到最终的结果即可。
  2. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码

class Solution {
    public boolean canSplitArray(List<Integer> nums, int m) {
        int n=nums.size();
        if (n <= 2) return true;
        // 维护前缀和
        int[] pre=new int[n+1];
        for(int i=0;i<n;i++){
            pre[i+1]=pre[i]+nums.get(i);
        }
        return process(0,n-1,nums,m,pre);
    }
    
    public boolean process(int l,int r,List<Integer> nums,int m,int[] pre){
        if(r-l+1==1) return true;
        if(pre[r+1]-pre[l]<m) return false;
        for(int i=l;i<r;i++){
            if(process(l,i,nums,m,pre)&&process(i+1,r,nums,m,pre)) return true;
        }
        return false;
    }
    
}

🥦 运行结果

时间复杂度&空间复杂度

时间超限,不要紧,是我们意料之中的结果!
在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。

🥦 实现代码

class Solution {
    int[][] dp;
    public boolean canSplitArray(List<Integer> nums, int m) {
        int n=nums.size();
        if (n <= 2) return true;
        int[] pre=new int[n+1];
        for(int i=0;i<n;i++){
            pre[i+1]=pre[i]+nums.get(i);
        }
        dp=new int[n][n];
        for(int i=0;i<n;i++) Arrays.fill(dp[i],-1);
        return process(0,n-1,nums,m,pre);
    }
    
    public boolean process(int l,int r,List<Integer> nums,int m,int[] pre){
        if(dp[l][r]!=-1) return dp[l][r]==1?true:false;
        if(r-l+1==1){
            dp[l][r]=1;
            return true;
        }
        if(pre[r+1]-pre[l]<m){
            dp[l][r]=0;
             return false;
        }
        for(int i=l;i<r;i++){
            if(process(l,i,nums,m,pre)&&process(i+1,r,nums,m,pre)){
                dp[l][r]=1;
                return true;
            }
        }
        dp[l][r]=0;
        return false;
    }
    
}

🥦 运行结果

通过缓存,将重复计算的结果缓存下来,通过。

时间复杂度&空间复杂度
在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

js加密解决方案1:在AutoJS中实现Promise的必要性、好处与缺点

AutoJS是一款强大的Android自动化工具&#xff0c;可以帮助用户编写脚本来实现手机自动化操作。然而&#xff0c;它的加密代码只支持ES5语法&#xff0c;不支持许多ES6的新特性&#xff0c;如Promise等功能。如果想在ES5语法环境中使用ES6的一些新特性&#xff0c;就需要自己实…

LeetCode--HOT100题(30)

目录 题目描述&#xff1a;24. 两两交换链表中的节点&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;24. 两两交换链表中的节点&#xff08;中等&#xff09; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节…

二分查找理论Binary Search代码实现及P1102 A-B 数对

二分查找 在一个1&#xff5e;n的递增序列中&#xff0c;怎么用二分查找数字x的下标&#xff1f; 在一个没用重复元素的递增序列中&#xff0c;用二分查找的方法最多需要查找log(n)次&#xff0c;也就是在一个区间内l&#xff5e;r不断的选取中间下标(mid)&#xff0c;直到mi…

maven如何建立JavaWeb项目并连接数据库,验证登录

这里是建立建立web项目&#xff1a;Maven如何创建Java web项目&#xff08;纯干货版&#xff09;&#xff01;&#xff01;&#xff01;_明天更新的博客-CSDN博客 我们主要演示如何连接数据库验证登录。 1.在webapp目录下创建我们的登录页面&#xff1a;index.jsp 还需要再…

生信豆芽菜-单基因与免疫浸润的关系

网址&#xff1a;http://www.sxdyc.com/panCancerImmuInfil 该工具主要用于查看单基因在泛癌中与免疫细胞评分的相关性 提交后等待运行成功即可&#xff0c;还可以关注&#xff1a;豆芽数据分析

Modbus工业RFID设备在自动化生产线中的应用

传统半自动化生产线在运作的过程&#xff0c;因为技工的熟练程度&#xff0c;专业素养的不同&#xff0c;在制造过程中过多的人为干预&#xff0c;工厂将很难对每条生产线的产能进行标准化管理和优化。如果半自动化生产线系统是通过前道工序的作业结果和检测结果来决定产品在下…

MySQL事务隔离级别、锁机制、三大范式

目录 一、事务 1.概念 2.事务的特性 3.并发带来的问题 4.事务的隔离级别 二、锁机制 1.什么是锁 2.MySQL锁分类 3.乐观悲观锁 4.共享排它锁 5.意向锁 6.粒度锁 三、三大范式 1.第一范式 2.第二范式 3.第三范式 一、事务 1.概念 事务是逻辑上的一组操作&#xf…

XXL-JOB任务调度平台的安装使用教程(保姆级教程)

首先从GitHub上面将项目clone下来。 GitHub地址&#xff1a;https://gitee.com/xuxueli0323/xxl-job.git 下载好之后&#xff0c;然后通过IDEA打开&#xff0c;将Maven编译好后项目结构如下 在数据库中运行这个SQL文件 &#xff0c;将基础表创建出来。就可以得到左边图中那些表…

P12-Retentive NetWork-RetNet挑战Transformer

论文地址:https://arxiv.org/abs/2307.08621 目录 Abstract 一.Introduction 二.Retentive Networks 2.1Retention 2.2Gated Multi-Scale Retention 2.3Overall Architecture of Retention Networks 2.4Relation to and Differences from Previous Methods 三.Experime…

并发编程的艺术-“程”:探索进程、线程、协程、纤程与管程

一、并发中的程 在计算机科学领域&#xff0c;处理多任务和并发执行是一项重要的挑战。为了解决这个问题&#xff0c;出现了多种并发模型和概念&#xff0c;包括进程、线程、协程、纤程和管程。本文将深入探讨这些并发概念&#xff0c;帮助读者理解它们的原理、特点和应用场景…

ABeam×Startup丨德硕管理咨询(深圳)创新研究团队前往灵境至维·既明科技进行拜访交流

近日&#xff0c;德硕管理咨询&#xff08;深圳&#xff09;&#xff08;以下简称“ABeam-SZ”&#xff09;创新研究团队一行前往灵境至维既明科技有限公司&#xff08;以下简称“灵境至维”&#xff09;进行拜访交流&#xff0c;探讨线上虚拟空间的商业模式。 现场合影 &…

PMP备考指南来啦!

第一步&#xff1a;通读教材&#xff0c;了解学习内容 在正式开始课程的学习前&#xff0c;可以先快速简单地阅览一遍教材&#xff08;PMBOK&#xff09;&#xff0c;在较短的时间内知道自己将要学习的是什么内容&#xff1b;同时可以标记出难理解的知识点。这样做有以下两个好…

CHATGPT源码简介与使用指南

CHATGPT源码的基本介绍 CHATGPT源码备受关注&#xff0c;它是一款基于人工智能的聊天机器人&#xff0c;旨在帮助开发者快速搭建自己的聊天机器人&#xff0c;无需编写代码。下面是对CHATGPT搭建源码的详细介绍。 CHATGPT源码的构建和功能 CHATGPT源码是基于Google的自然语言…

【实用干货】3个技巧 - 教你怎么提取公众号封面图!

平时刷公众号的时候遇到自己喜欢的封面&#xff0c;怎么撸过来呢&#xff1f;小埋教大家几个比较实用的方法。 1.135编辑器提取 也是小埋酱经常用的工具&#xff0c;因为平时码字的时候是用的135&#xff0c;所以用起来比较方便&#xff0c;不光光是公众号、视频、音频、视频号…

【腾讯云 TDSQL-C Serverless 产品体验】 使用 Python 向 TDSQL-C 添加读取数据 实现词云图

文章目录 前言学到什么?准备工作申请TDSQL数据库1. 点击登录腾讯云2. 点击立即选购 ,如下图所示3. 选购页面中的数据库配置选项如下4. 基础信息5. 配置完成后点击 右下角的立即购买即可6. 点击立即购买后会有弹窗如下, 再次点击7. 购买完成后 , 会出现弹窗 , 点击前往管理页面…

SD卡相关资料

STM32429I-EVAL1 正点原子 ALIENTEK探索者STM32F4、ALIENTEK战舰STM32F1 V3 野火 野火STM32F103-V2霸道 中科蓝汛 AB5322B QFN32内部软开关蓝牙音箱

ppt怎么转pdf文件?这几种方法搞定

ppt怎么转pdf文件&#xff1f;将ppt转为pdf可以让你更方便地分享你的演示文稿&#xff0c;无论你的观众使用的是什么设备或操作系统&#xff0c;他们都可以轻松地查看你的演示文稿。此外&#xff0c;将ppt转为pdf还可以防止其他人修改你的文稿&#xff0c;保证了你的演示文稿的…

Vue-打印组件页面

场景: 需要将页面的局部信息打印出来&#xff0c;只在前端实现&#xff0c;不要占用后端的资源。经过百度经验&#xff0c;决定使用 print-js和html2canvas组件。 1. 下载包 npm install print-js --save npm install --save html2canvas 2. 组件内引用 <script>impo…

解决 Mac 上使用 Electron Updater 更新 App 不成功的问题!!!

文章目录 1. 现象2. 分析并如何解决3. 后续 1. 现象 在Mac电脑上&#xff0c;使用Electron Updater对程序进行更新&#xff0c;但是一直不成功&#xff0c;也不报错。具体表现是这样的&#xff1a;当前我的程序版本是3.11版本&#xff0c;点击更新之后&#xff0c;也下载了&am…

16.2.3 【Linux】离线管理问题

要注意的是&#xff0c;我们在工作管理当中提到的“背景”指的是在终端机模式下可以避免 [crtl]-c 中断的一个情境&#xff0c; 你可以说那个是 bash 的背景&#xff0c;并不是放到系统的背景去。所以&#xff0c;工作管理的背景依旧与终端机有关。在这样的情况下&#xff0c;如…