文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给定一个数组 A,将其划分为两个不相交(没有公共元素)的连续子数组 left 和 right, 使得:

  • left 中的每个元素都小于或等于 right 中的每个元素。
  • left 和 right 都是非空的。
  • left 要尽可能小。

在完成这样的分组后返回 left 的长度。可以保证存在这样的划分方法。

示例 1:
输入:[5,0,3,8,6]
输出:3
解释:left = [5,0,3],right = [8,6]示例 2:
输入:[1,1,1,0,6,12]
输出:4
解释:left = [1,1,1,0],right = [6,12]提示:
2 <= A.length <= 30000
0 <= A[i] <= 10^6

可以保证至少有一种方法能够按题目所描述的那样对 A 进行划分。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-array-into-disjoint-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 用两个数组记录:左侧最大的,右侧最小的
  • 遍历上面的数组,找到第一个位置,左侧最大的 <= 右侧最小的
class Solution {public:int partitionDisjoint(vector<int>& A) {int n = A.size(), MAX = INT_MIN, MIN = INT_MAX;vector<int> left_max(n), right_min(n);for(int i = 0; i < n; i++) {MAX = max(MAX, A[i]);left_max[i] = MAX;}for(int i = n-1; i >= 0; i--) {MIN = min(MIN, A[i]);right_min[i] = MIN;}for(int i = 0; i < n-1; i++){if(left_max[i] <= right_min[i+1])return i+1;}return -1;}
};

64 ms 21 MB

还有一次遍历的方法:

class Solution {public:int partitionDisjoint(vector<int>& A) {int n = A.size(), MAX = A[0], prev_MAX = A[0], pos = 0;for(int i = 0; i < n; i++) {MAX = max(MAX, A[i]);if(A[i] >= prev_MAX)//A[i] 比之前的最大值大,找到了分割点continue;// 上面的不成立,A[i] 要被分在左边pos = i;prev_MAX = MAX;}return pos+1;}
};

60 ms 19.8 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 915. 分割数组相关推荐

  1. LeetCode 659. 分割数组为连续子序列

    LeetCode 659. 分割数组为连续子序列 回顾 根据题意,每个元素只会涉及两种情况: 已经存在nums[i]-1结尾的序列,我们把nums[i]接到之前的某个序列后. 尝试以nums[i]为头 ...

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

    1. 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小.注意: 数组长度 n 满足以下条件:1 ≤ n ≤ ...

  3. 915. 分割数组、剑指 Offer II 076. 数组中的第 k 大的数字

    LeetCode题解 1.分割数组 2.数组中的第 k 大的数字 1.分割数组 题目描述: ➡️挑战链接⬅️ 分析: 首先题目叙述的很简单: 要求呢 1.左右两个区间元素必须连续 2.左右区间必须都有 ...

  4. LeetCode 410——分割数组的最大值

    1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution {public:// 若分割数组的最大值为 ...

  5. LeetCode 659. 分割数组为连续子序列(哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 . 如果可以完 ...

  6. LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 DP 1. 题目 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组. 设计一个算法使得这 m 个子数组各自和 ...

  7. Leetcode 410.分割数组的最大值(最优解是二分法)

    Time: 20190904 Type: Hard, DP 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最 ...

  8. leetcode 659. 分割数组为连续子序列(贪心算法)

    给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 . 如果可以完成上述分割,则返回 true :否则,返回 f ...

  9. LeetCode 410. 分割数组的最大值

    题目描述: 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ ...

最新文章

  1. linux c 函数专挑,Linux C wait函数
  2. 奖励名单表格模板_员工出勤工薪记算表(行政人事模板)
  3. Web前端如何学?Web前端学习方法分享
  4. 洛谷 一种堆套路 P1631序列合并、P2085最小函数值
  5. rails_Rails应用程序必备的宝石
  6. Django 文件上传与下载的相关问题
  7. Oracle dbms_job管理
  8. 数据结构——树状数组
  9. java多线程学习系列
  10. 190527每日一句,励志| 为了成功,约束自己;有时候“再等等”,就再也等不到了
  11. 用mysql搭建蚂蚁笔记_利用蚂蚁笔记搭建个人云笔记/博客
  12. 【神经网络】LSTM理论介绍
  13. 模仿百度“您要找的是不是:”提示功能
  14. 一万字一篇文20分钟学会C语言和Python,十四年编程经验老鸟传授经验之道
  15. Web——P2P应用
  16. 本科科研经历(技术干货篇-论文发表流程)
  17. Big-man进军Linux系统(一)
  18. bzoj 5248: [2018多省省队联测]一双木棋 博弈论+状压dp
  19. Spring Security 参考手册(一)
  20. HBase分享 | Flink+HBase场景化解决方案

热门文章

  1. oracle并发执行max,跪求大量并发执行insert into select语句的方案
  2. 【设计模式 06】原型模式(克隆??)
  3. c++远征之多态篇——异常处理
  4. java 圆的交点_java – 获取线条和形状的交点
  5. Python 实现微信小程序的用户登录
  6. 【转】oracle数据库中varchar2陷阱
  7. vim 常用快捷键总结
  8. 项目管理中的沟通管理(转)
  9. codeforce gym 100548H The Problem to Make You Happy
  10. python子类分配