【每日一题】分割数组

2023-11-01

题目链接

题目描述:

给定一个数组 nums ,将其划分为两个连续子数组 left 和 right, 使得:
left 中的每个元素都小于或等于 right 中的每个元素。
left 和 right 都是非空的。
left 的长度要尽可能小。
在完成这样的分组后返回 left 的 长度

用例可以保证存在这样的划分方法。

示例 1:

输入:nums = [5,0,3,8,6]
输出:3
解释:left = [5,0,3],right = [8,6]

示例 2:

输入:nums = [1,1,1,0,6,12]
输出:4
解释:left = [1,1,1,0],right = [6,12]

思路分析:

两次遍历

题目要我们left 中的每个元素都小于或等于 right 中的每个元素,我们可以理解为left中最大的元素小于等于right中最小的元素
怎么知道right中的最小值?
可以采用反向遍历的方法:创建个等大的MinRight数组,先放置最后一个元素,遍历判断当前i位置的nums的元素是否小于MinRight[i + 1]位置的元素。如图:
在这里插入图片描述
当minRight数组安置完后:
在这里插入图片描述
此时我们定义一个MaxLeft变量,用来记录left范围的最大值,遍历数组当我们发现MaxLeft <= MinRight[i + 1]时,就可以返回i + 1(长度)了。因为MinRight[i + 1]代表了i + 1位置及以后的最小值

代码如下:

class Solution {
public:
    int partitionDisjoint(vector<int>& nums) {
        int n = nums.size();
        // 右数组的最小值
        vector<int> MinRight(n);
        MinRight[n - 1] = nums[n - 1];
        for (int i = n - 2; i >= 0; i--)
        {
            MinRight[i] = min(MinRight[i + 1], nums[i]);
        }
        int MaxLeft = MinRight[0];
        for (int i = 0; i < n - 1; i++)
        {
            MaxLeft = max(MaxLeft, nums[i]);
            if (MaxLeft <= MinRight[i + 1])
            {
                return i + 1;
            }
        }
        // 题目保证有
        return n - 1;
    }
};

一次遍历(优化空间复杂度)

我们可以先设置一个变量pos来划分left和right区间,然后用LeftMax来记录left区间的最大值,向后遍历动态改变pos和LeftMax:后边遇比LeftMax小的元素就把pos移过去,这个时候有可能在中途就出现了比LeftMax更大的元素,所以还需要定义CurMax来记录出现过的最大的元素。

代码如下:

class Solution {
public:
    int partitionDisjoint(vector<int>& nums) {
        int n = nums.size();
        int CurMax = nums[0], pos = 0, LeftMax = nums[0];
        for(int i = 0; i < n - 1; i++)
        {
            CurMax = max(CurMax, nums[i]);
            if(LeftMax > nums[i])
            {
                pos = i;
                LeftMax = CurMax;
            }
        }
        return pos + 1;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【每日一题】分割数组 的相关文章

随机推荐

  • 使用github生成在线前端项目链接

    作为一个前端小白 一开始是想面试的时候可以让HR直观地看到我的前端项目 然后就在网上找方法可以怎么解决我的这个需求 直至昨天 参考各位大佬的笔记和博客 断断续续 摸索了好几天 总算有个自己的网址 看到的方法大致如下 一 使用花生壳软件进行远
  • H5网页跳转打开微信小程序详解(含完整代码)

    限制条件 目前仅支持在微信内打开H5页面 已认证的服务号 服务号绑定 JS接口安全域名 下的网页可使用此标签跳转任意合法合规的小程序 已认证的非个人主体的小程序 使用小程序云开发的静态网页托管绑定的域名下的网页 可以使用此标签跳转任意合法合
  • csharp: Export DataSet into Excel and import all the Excel sheets to DataSet

  • 红帽Redhat—使用VMware Workstation 16 Pro 安装RHEL8.3登陆

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 环境工具准备 二 VMware Workstation 16 Pro虚拟机创建步骤 三 安装RHEL8 3系统操作步骤 四 操作系统的管理方式 五 SSH远程登
  • [java] mvn 使用笔记

    设置版本号 mvn versions set mvn versions commit
  • C语言结构体

    一 结构体的定义 结构体 Struct 是C语言中的一个重要数据类型 它可以用来存储多个不同类型的变量 结构体类似于一个自定义的数据类型 可以包含多个不同类型的成员变量 每个成员变量可以有自己的数据类型和值 二 结构体存储数据方式 结构体存
  • windows10在资源管理器下右键文件出现无响应解决方案

    1 下载右键菜单管理工具 使用二分查找找到产生问题的原因 我这里是因为qingshellext Class 禁用以后就没有问题了
  • 数组的转置和轴对称(python)

    文章目录 TOC 文章目录 1 什么叫轴 2 什么叫转置 3 转置 3 1简单转置 像二位数组 只有两个轴 再怎么转置也只是两个轴进行位置交换 所以 直接使用T就可以了 例如 3 2transpose 方法进行转置 3 3swapaxes
  • Android SQLite 数据库 存取 BLOB 二进制 文件

    Android开发时用到二进制数据 也可以理解为BYTE数组 的SQLite存取 可能会有人对存取如mp3 图片类文件困惑 其实p3 图片类文件读到内存就可理解为BYTE数组 只要在 下面的基础上增加将文件读到BYTE数组就可以了 其他操作
  • python设置下载源

    我们一般直接用pip下载三方包会很慢 设置以下命令可以加速下载 pip config set global index url Simple Index pip3 9 config set global index url Simple I
  • element Dialog子组件弹框

    父组件 div div
  • 深度学习从入门到精通——基于深度学习的地震数据去噪处理

    传统机器学习 SVM boosting bagging knn 深度学习 CNN 典型 GAN 地震应用方向 叠前地震数据随机噪声去除 实现噪声分离 面波去噪 面波作为很强的干扰波出现在地震勘探中 大大降低了地震记录的分 辨率和信噪比 深度
  • Go语言面试题--基础语法(24)

    文章目录 1 下面这段代码输出什么 2 下面代码输出什么 3 下面这段代码能否编译通过 如果通过 输出什么 1 下面这段代码输出什么 type Direction int const North Direction iota East So
  • 集成测试是接口测试吗_集成测试值得麻烦吗?

    集成测试是接口测试吗 是否编写集成测试可能是一个宗教问题 您相信还是不相信它们 我们甚至所说的集成测试都可能导致无休止的语义争论 单元测试很容易定义 它们可以测试单个单元 单个类 单个方法 对该方法的行为进行单个声明 您可能需要模拟 同样
  • ERROR: No matching distribution found for git

    问题描述 ERROR Could not find a version that satisfies the requirement git from versions none ERROR No matching distribution
  • 【html初识】HTML基础认知

    1 1 1认识网页 1 网页有哪些部分组成 文字 图片 视频 音频 超链接 2 网页背后的本质是什么 前端程序员写的代码 3 前端的代码通过什么软件转换成用户眼中的页面 通过浏览器转化 解析和渲染 成用户看到的网页 4 五大浏览器和渲染引擎
  • python 程序结构

    目录 1 顺序结构 2 分支结构 单分支 双分支 多分支 3 循环结构 for循环 while循环 例 九九乘法表 for 方法 while方法 1 顺序结构 顺序结构是最简单的程序结构 也是最常用的程序结构 只要按照解决问题的顺序写出相应
  • 面试准备:Java新特性详解

    文章目录 Java语言新特性 1 Lambda表达式和函数式接口 2 接口的默认方法和静态方法 3 方法引用 4 重复注解 5 更好的类型推断 6 拓宽注解的应用场景 Java编译器新特性 参数名称 JVM的新特性 更多资料 参考 java
  • v-model

    十 v model 10 1 v model的基本使用 div div
  • 【每日一题】分割数组

    分割数组 两次遍历 一次遍历 优化空间复杂度 题目链接 题目描述 给定一个数组 nums 将其划分为两个连续子数组 left 和 right 使得 left 中的每个元素都小于或等于 right 中的每个元素 left 和 right 都是