题目:

给定一个数组 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. bounties 赏金 bon = good 来自法语 bonjour 早上好

    bounties 赏金 bon = good 来自法语 bonjour 早上好

  2. 【stars-one】星念音乐下载器

    一款可将各个音乐网站可在线播放的音乐保存到本地的软件,目前暂且支持网易云音乐 获取软件 星念音乐下载器pc版v1.5 https://www.ilanzou.com/s/CI7zaWz 星念音乐下载器 ...

  3. day06-JavaScript03

    JavaScript03 11.DOM 官方文档:https://www.w3school.com.cn/js/js_htmldom.asp 基本介绍: DOM全称是Document Object M ...

  4. AOSP-刷机

    准备 1.AOSP源码下载 可以参考AOSP下载且编译 这里我下载的是android-12.1.0_r5的AOSP源码 2.下载驱动 因为我下载的是android-12.1.0_r5的AOSP源码,因 ...

  5. 如何用数字人技术让课堂活起来?番职院和3DCAT实时云渲染给出答案

    2023年4月20日,广州市第二届智慧教育成果巡展活动在番禺职业技术学院(下文简称番职院)举行,本次活动的主题是''智能AI助教-让课堂活起来''. 活动现场,瑞云科技受邀展示了其自主研发的瑞云数字人 ...

  6. 记录--说一说css的font-size: 0

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 平常我们说的font-size:0:就是设置字体大小为0对吧,但是它的用处不仅仅如此哦,它还可以消除子行内元素间额外多余的空白! 问题描述 ...

  7. 记录:Openlayers6.5 实现轨迹回放

    这篇分享我记录到的一个案例,废话不多说,上代码 import Feature from 'ol/Feature' import LineString from 'ol/geom/LineString' ...

  8. 鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)

    一.GridRow/GridCol 1.概述 栅格布局是一种通用的辅助定位工具,可以帮助开发人员解决多尺寸多设备的动态布局问题.通过将页面划分为等宽的列数和行数,栅格布局提供了可循的规律性结构,方便开 ...

  9. Boruta特征选择

    Boruta特征选择 官方github地址:https://github.com/scikit-learn-contrib/boruta_py?tab=readme-ov-file 论文地址:http ...

  10. KingabseES 隐式游标属性值(SQL%attribute)

    隐式游标介绍 Oracle数据库迁移到KingbaseES数据库,不需要将源PL/SQL脚本,大规模修改为KES语法,因为KingbaseES支持大部分PLSQL语法. 1.隐式游标 隐式游标是由 P ...