题目:

给定一个数组 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. 灰度发布、蓝绿部署、金丝雀发布和AB测试及在k8s中的实现

    灰度发布.蓝绿部署.金丝雀发布和AB测试都是软件开发和部署中常用的策略,每种策略都有其特定的用途和优势.下面是对这些策略的简要解释: 灰度发布(Grayscale Release): 灰度发布是一种逐 ...

  2. c语言中float和double类型的区别

    1.变量bai类型不同 float属于单du精度zhi型浮点数据. double属于双精度型浮点数据. 2.指数范围不同 float的指数范围为-127~128. double而double的指数范围 ...

  3. Window资源管理器插件增强,可显示Android的apk图标

    身为Android开发人员,更习惯看到apk的图标,但是windows系统默认不支持显示pak图标,找了会插件,终于是找到了 安装 下载软件压缩包,下载地址:https://stars-one.lan ...

  4. SparseTable ST表

    Sparse Table ST表是一个静态二维数组st[i][j],作用是快速查询(O(1))区间最值(不只是最值,可重复贡献问题都可以用),st[i][j]代表的是在以引索i为起点,长度为\(2^j ...

  5. Miracast技术详解(四):Sink源码解析

    目录 简介 Sink端源码 RTSP通讯 RTP通讯 播放阶段 MPEG2-TS解析 总结 简介 在<Android Studio导入Android 4.2.2的WiFi-Display系统源码 ...

  6. ssm整合简单配置

    最近由于系统重装,之前已经写好了的框架都被我删的一干二净,于是自己动手重新搭了个简单的ssm(spring springmvc mybatis) 运行环境 (java1.8,Tomcat8.5,mav ...

  7. KingbaseES V8R3 集群运维系列之 -- network_rewind.sh磁盘检测功能详解

    ​ 案例说明: 在KingbaseES V8R3集群,network_rewind.sh用于当节点数据库服务down时,实现数据库服务的自动恢复功能.在network_rewind.sh执行时,会对数 ...

  8. WPF如何封装一个可扩展的Window

    前言 WPF中Window相信大家都很熟悉,有时我们有一些自定义需求默认Window是无法满足的,比如在标题栏上放一些自己东西,这个时候我们就需要写一个自己的Window,实现起来也很简单,只要给Wi ...

  9. JavaScript语法-字符串模板

    目录 JavaScript 模板字符串 代码 问题 初学者容易出现的错误 调用函数的情况 JavaScript 模板字符串 代码 以下是index.js的部分代码: onShareAppMessage ...

  10. 3个.NET开源、免费、强大的商城系统

    前言 今天大姚给大家分享3个.NET开源.免费.强大的商城系统,希望可以帮助到有商城系统开发需求的同学. nopCommerce nopCommerce是一个功能丰富.免费.灵活且可定制的开源电子商务 ...