【LeetCode】数组-4(581)-给未排序数组中子数组排序使得整个数组排序 找到这个最小的子数组
这道题目感觉并不太容易,也并没有想到什么比较好的方法,看来还是积累太少。
思路一:两个指针向后遍历,分别记下造成逆序的最小和最大下标位置
优化的暴力解法(很精妙,面试的时候可以说出来)
思想:两个指针向后遍历,后面的比前面的大时,分别记录这两个元素的下标 lo 和 hi,前面的下标是造成逆序的第一个元素所以我们记录它,它也一直是后面逆序出现位置的最小值。二而后面的元素更新一直都表示构成元素逆序的最大下标位置。
最后 hi-lo+1就是 最小的那个子数组。
【正确代码】
public class Solution {
public int findUnsortedSubarray(int[] nums) {
int lo = Integer.MAX_VALUE, hi = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
for (int j = i; j < nums.length; j++) {
if (nums[j] < nums[i]) {
lo = Math.min(lo, i);
hi = Math.max(hi, j);
}
}
}
return hi - lo < 0 ? 0 : hi - lo + 1;
}
}
复杂度分析
时间复杂度:O(n^2)
空间复杂度:o(1)
思路二:和排序后的比较,找出前后第一个不相等的数字,计算下标差
【正确代码】
public class Solution {
public int findUnsortedSubarray(int[] nums) {
int[] sortNums = new int[nums.length];
System.arraycopy(nums, 0, sortNums, 0, nums.length);
Arrays.sort(sortNums);
int lo = nums.length - 1, hi = 0;
int i = 0, j = nums.length - 1;
while (i < nums.length - 1) {
if (sortNums[i] != nums[i]) {
lo = i;
break;
}
i++;
}
while (j > 0) {
if (sortNums[j] != nums[j]) {
hi = j;
break;
}
j--;
}
return hi - lo <= 0 ? 0 : hi - lo + 1;
}
}
复杂度分析
时间复杂度:O(n*logn) 主要消耗在排序
空间复杂度:O(n) 申请了空间
思路三:使用stack,从前向后压栈,找到第一个下降的元素,并记录下标。同理,从后向前,找到第一个上升元素,并记录下标,最后计算下标差即可。
第一次写时出现错误,没有考虑到等于的情况。
【错误代码】
public class Solution {
public int findUnsortedSubarray(int[] nums) {
Stack<Integer> stack = new Stack<>();
int lo = 0, hi = 0;
one: {
for (int i = 0; i < nums.length; i++) {
while (!stack.isEmpty() && nums[stack.peek()] > nums[i]) { //stack 中元素大于新添加元素
lo = stack.peek();
break one;
}
stack.push(i);
}
}
stack.clear();
two: {
for (int i = nums.length - 1; i >= 0; i--) {
while (!stack.isEmpty() && nums[stack.peek()] < nums[i]) {
hi = stack.peek();
break two;
}
stack.push(i);
}
}
return hi - lo <= 0 ? 0 : hi - lo + 1;
}
}
【错误输出】
【分析错误原因】
不要随意使用break,蓝色处很重要只要比栈顶大就一只向外弹出。改正代码如下:
【正确代码】
class Solution {
public int findUnsortedSubarray(int[] nums) {
Stack<Integer> stack = new Stack<>();
int lo = nums.length - 1;
int hi = 0;
for (int i = 0; i < nums.length; i++) {
while (!stack.isEmpty() && nums[i] < nums[stack.peek()]) {
lo = Math.min(lo, stack.pop());
}
stack.push(i);
}
stack.clear();
for (int j = nums.length -1; j >= 0; j--) {
while (!stack.isEmpty() && nums[j] > nums[stack.peek()]) {
hi = Math.max(hi, stack.pop());
}
stack.push(j);
}
return hi - lo > 0 ? hi - lo + 1 : 0;
}
}
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n) stack的深度
思路四:从前往后找,从前面比后面小的数中,找到并保存其中最小的数,之后再从前向后找,找出第一个大于这个数的下标即为所求。后面同理。
【LeetCode】数组-4(581)-给未排序数组中子数组排序使得整个数组排序 找到这个最小的子数组的更多相关文章
- LeetCode:长度最小的子数组【209】
LeetCode:长度最小的子数组[209] 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 ...
- 【LeetCode】209. 长度最小的子数组
209. 长度最小的子数组 知识点:数组:前缀和:二分法:双指针:滑动窗口 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小 ...
- leetcode-209-长度最小的子数组
题目描述: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...
- 领扣-209 长度最小的子数组 Minimum Size Subarray Sum MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Leetcode 209.长度最小的子数组 By Python
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums = [2, ...
- LeetCode 209. 长度最小的子数组(Minimum Size Subarray Sum)
题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...
- Java实现 LeetCode 209 长度最小的子数组
209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = ...
- LeetCode 长度最小的子数组
题目: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0. 思路: 非常明显用滑动窗口处 ...
- **209. Minimum Size Subarray Sum 长度最小的子数组
1. 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nu ...
随机推荐
- 【前端】一步一步使用webpack+react+scss脚手架重构项目
前言 前几天做了一个项目:[node]记录项目的开始与完成——pipeline_kafka流式数据库管理项目:因为开发时间紧迫,浅略的使用了一下react,感觉这个ui库非常的符合我的口味,现在趁着有 ...
- Web office apps 安装部署
系统要求为Windows Server 2012, 注意:安装Office Web Apps的服务器除了Office Web Apps之外,不能安装其他应用.包括不能安装Office,lync,,sh ...
- Struts 之 通配符 路径匹配 常量用法 配置默认值
Struts 框架学习 Action的开发的几种方式 方式1 : 继承ActionSupport 如果使用Struts校验功能,必须继承此类 方式2 : 实现Action接口 方式3 :不继承 ...
- iOS实现Android中Gone的功能
实现隐藏view但不占位置的需求是很常见的(Android里的view.GONE),可iOS里并没有这玩意,只有hidden.于是自己写了一个一般情况下用的category,特殊情况就得看情况做了.其 ...
- Oracle PIVOT 行转列方法
数据库中業種的存储如下图: SELECT * FROM M_TORIHIKISAKI_GYOSYU 其中GYIUSYU_CD字段代表不同的業種 而画面需要实现下图所示样式:(将每条数据的業種横向展开显 ...
- 怎么在linux Ubuntu上部署nodejs
今天特别开心,同时也有兴趣把最近的一些工作总结一下. 第一,方便记忆. 第二, 给需要的同学做参考 node.js 在本地的话,比较容易运行,node app.js 命令就搞定,但是当需要部署到生产环 ...
- jmeter问题处理随笔1 - CSV取值数据异常处理(包含"号,","号的情况)
背景 jmeter测试中通过CSV进行用例数据的管理,在result断言中间需要使用json格式的数据,会包含 " ",",这个时候发现CSV取值会报错或者乱码 解决 用 ...
- 史上最易懂——ReactNative分组列表SectionList使用详情及示例详解
React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...
- 阿里云服务器Windows Server 2008/2012部署Office Web Server 2013
以前成功将Office Web Server 2013部署在了本地服务器上,此次是将Office Web Server 2013部署在阿里云服务器Windows Server 2008和2012上,中 ...
- 移动端https抓包那些事--初级篇
对于刚刚进入移动安全领域的安全研究人员或者安全爱好者,在对手机APP进行渗透测试的时候会发现一个很大的问题,就是无法抓取https的流量数据包,导致渗透测试无法继续进行下去. 这次给大家介绍一些手机端 ...