题目:

给定一个数组 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]

提示:

2 <= nums.length <= 105
0 <= nums[i] <= 106
可以保证至少有一种方法能够按题目所描述的那样对 nums 进行划分。

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

解题思路:

一、前缀最大值+后缀最小值:只需要保证前缀的最大值小于等于后缀的最小值。

先从后往前遍历,找到数组的所有后缀的最小值在min数组中,min[i] = x :下标范围在[i, n-1]中nums[i]的最小值x。然后再从前往后遍历数组,统计出数组前缀的最大值 max,当遍历到某个位置时,如果数组前缀最大值小于等于数组后缀最小值,那么当前位置就是划分的分界点,然后返回长度(当前下标i + 1)。

java代码:

 1 class Solution {
2 public int partitionDisjoint(int[] nums) {
3 int n = nums.length;
4 int[] min = new int[n];
5 min[n-1] = nums[n-1];
6 //从后往前遍历,取得后缀的最大值
7 for(int i = n-2; i >= 0; i--){
8 min[i] = Math.min(nums[i], min[i+1]);
9 }
10 for(int i = 0, max = 0; i < n-1; i++){
11 //从前往后遍历,取得前缀的最大值
12 max = Math.max(max, nums[i]);
13 if(max <= min[i+1]){
14 return i + 1;
15 }
16 }
17 return -1;
18 }
19 }

 python3代码:

 1 class Solution:
2 def partitionDisjoint(self, nums: List[int]) -> int:
3 n = len(nums)
4 minright = [0] * n
5 minright[n-1] = nums[n-1]
6 for i in range(n-2, 0 , -1):
7 minright[i] = min(nums[i], minright[i+1])
8 maxleft = 0
9 for i in range(0, n):
10 maxleft = max(maxleft, nums[i])
11 if maxleft <= minright[i + 1]:
12 return i + 1
13 return -1

 二、一次遍历

参考@爪哇缪斯:https://leetcode.cn/problems/partition-array-into-disjoint-intervals/solution/zhua-wa-mou-si-tu-jie-leetcode-by-muse-7-omut/

left 中的每个元素都小于或等于 right 中的每个元素,对于数组left,需要一个变量leftMax来保存数组left中的最大数字,且设leftMax初始值就为nums[0],需要一个变量max来保存当前的最大值,max的初始值也设为nums[0],然后从 i =1开始往后遍历nums数组中的每个数字,当发现遍历的这个数字nums[i]大于leftMax的时候,则表示这个数字暂时可能不属于数组left,更新一下最大值max。当发现遍历的这个数字nums[i]小于leftMax的时候,则可以判断出nums[i]一定是属于数组left的,则移动index到当前的位置 i,更新leftMax的值为max,当我们遍历完所有的nums数组中的数字之后,index指向的位置就是数组left的最后一个元素的位置。那么数组left的长度就等于index + 1。

请见下图所示:

 java代码:

 1 class Solution {
2 public int partitionDisjoint(int[] nums) {
3 int n = nums.length;
4 int leftMax = nums[0], max = nums[0], index = 0;
5 for(int i = 1; i < n; i++){
6 if(leftMax > nums[i]){
7 index = i;
8 leftMax = max;
9 }else{
10 max = Math.max(max, nums[i]);
11 }
12 }
13 return index + 1;
14 }
15 }

小知识:

python中range():

range(n-1, 0, -1):从列表的下标为 i 的元素开始,倒序取到下标为0的元素(但是不包括下标为0元素)

力扣915(java&python)-分割数组(中等)的更多相关文章

  1. 力扣 -- 寻找两个有序数组的中位数 Median of Two Sorted Arrays python实现

    题目描述: 中文: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums ...

  2. 力扣(LeetCode)561. 数组拆分 I

    给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...

  3. 力扣(LeetCode)寻找数组的中心索引 个人题解

    给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不存在中心索引,那么我 ...

  4. 力扣Leetcode 面试题51. 数组中的逆序对 - 归并排序

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= ...

  5. 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字

    题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...

  6. python分割数组里面重复的元素

    c=[1,1,1,1,2,2,2,3,3,4,4,4,4,4,5,5,5,] a = [] x = [] for i in range(0,len(c)): if i + 1 < len(c): ...

  7. LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...

  8. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  9. 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度

    题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...

  10. 力扣——single number (只出现一次的数字) python实现

    题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 英 ...

随机推荐

  1. Android WebView获取html源码

    通过执行js语句来获取 val code = """ document.documentElement.outerHTML """.trim ...

  2. Java课堂

    import java.awt.*; import java.awt.event.*; import java.util.*; public class Main{ public static dou ...

  3. C# PaddleOCR 车牌识别

    效果 车牌识别测试地址 http://47.108.88.211/manual/VehPlateTest.html 通用OCR识别测试地址 http://47.108.88.211/manual/OC ...

  4. Twitter的分布式自增ID算法snowflake(雪花算法) C#和Java版

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID, 但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一 ...

  5. C# 通用OCR识别 文字识别 中文识别

    软件说明 基于以下两个开源项目,做了再次封装 https://github.com/paddlepaddle/PaddleOCR PaddleOCRSharp: 本项目是一个基于PaddleOCR的C ...

  6. 痞子衡嵌入式:给i.MXRT1xxx系列GPIO提早供电会影响DCDC_PSWITCH上电时序导致内部DCDC启动失败

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是给i.MXRT1xxx系列GPIO提早供电会影响DCDC_PSWITCH上电时序导致内部DCDC启动失败. 最近有一个 RW612 产品 ...

  7. CornerNet-Lite:CornerNet粗暴优化,加速6倍还提点了 | BMVC 2020

    论文对CornerNet进行了性能优化,提出了CornerNet-Saccade和CornerNet-Squeeze两个优化的CornerNet变种,优化的手段具有很高的针对性和局限性,不过依然有很多 ...

  8. 测试开发之系统篇-安装KVM虚拟机

    虚拟机(Virtual Machine)和容器(Container)是两种流行的虚拟化技术. 虚拟机模拟机器的硬件,包括了完整的操作系统和应用,它一旦被开启,预分配给它的资源将全部被占用.容器是运行在 ...

  9. 关于JDK21控制台字符集编码问题

    关于JDK21控制台字符集编码问题 前言: 某日尝试JDK21,idea控制台字符集编码一直乱码,后将idea所有能配置UTF-8的配置都配了一遍,无果,后搜索JDK21字符集编码相关后解决 1.配置 ...

  10. #01背包#洛谷 4161 [SCOI2009]游戏

    题目 将 \(n\) 拆成若干个正整数的和, 问这些正整数的LCM有多少种 \(n\leq 10^3\) 分析 考虑这个\(LCM\)一定是1或者由若干个质数的指数幂相乘得到的, 那么可以设\(dp[ ...