Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too.

You need to find the shortest such subarray and output its length.

Example 1:

Input: [2, 6, 4, 8, 10, 9, 15]
Output: 5
Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.

Note:

  1. Then length of the input array is in range [1, 10,000].
  2. The input array may contain duplicates, so ascending order here means <=.

题目标签:Array

  题目给了我们一个nums array, 让我们找出一个最短的无序连续子数组,当我们把这个子数组排序之后,整个array就已经是排序的了。

  要找到这个子数组的范围,先要了解这个范围的beg 和 end 是如何定义的。

  来看这个例子:1 5 4 5

  a. 当我们找到第一个违反ascending 排序的数字 2的时候,我们不能是仅仅把beg 标记为2的前面一个数字7,而是要一直往前,找到一个合适的位置,找到在最前面位置的比2大的数字,这里是3。

  b. 同样的,为了找end, 那么我们要从7的后面开始找,一直找到一个最后面位置的比7小的数字,这里是6。

  这样的话,范围就是3到6 是我们要找的子数组。把3到6排序完了之后,整个array 就已经是排序的了。

  这里我们可以发现,2是min, 7是max,所以我们可以分两个方向来分别寻找beg 和end。

  从右到左(绿色),维护更新min 和 beg;

  从左到右(红色),维护更新max 和 end。

Java Solution:

Runtime beats 89.16%

完成日期:10/15/2017

关键词:Array

关键点:分别以两个方向来找到beg 和 end

 class Solution
{
public int findUnsortedSubarray(int[] nums)
{
int n = nums.length;
int beg = -1;
int end = -2; // end is -2 is because it works if the array is already in ascending order
int min = nums[n-1]; // from right to left
int max = nums[0]; // from left to right for(int i=0; i<n; i++)
{
max = Math.max(max, nums[i]);
min = Math.min(min, nums[n-1-i]); if(nums[i] < max)
end = i;
if(nums[n-1-i] > min)
beg = n-1-i;
} return end - beg + 1; // if array is already in ascending order, -2 - (-1) + 1 = 0
}
}

参考资料:

https://discuss.leetcode.com/topic/89282/java-o-n-time-o-1-space

LeetCode 题目列表 - LeetCode Questions List

最新文章

  1. 【原】移动web页面支持弹性滚动的3个方案
  2. Stack Overflow: The Architecture - 2016 Edition
  3. C/C++ http协议加载sessionID
  4. Using python to process Big Data
  5. MySQL的备份的一些策略和方法的总结
  6. NSArray和NSDictionary的混合
  7. UITableView详解(1)
  8. Haskell递归
  9. HUST 1376 Random intersection
  10. 浏览器拦截js打开新窗口
  11. SDWebImage源码解析
  12. oracle 定时 job
  13. Elasticsearch index fields 重命名
  14. 二分 poj 3273
  15. 调整Intellij IDEA内存
  16. php 原生文件下载
  17. 风景区的面积及道路状况分析问题 test
  18. Docker 启动Centos
  19. Bootstrap3.0 栅格系统背后的精妙魔法(Bootstrap3.0的栅格布局系统实现原理)
  20. linux加域退域

热门文章

  1. Cnblogs关于嵌入js和css的一些黑科技
  2. HiWord()
  3. 再起航,我的学习笔记之JavaScript设计模式27(链模式)
  4. Training little cats poj3735
  5. The Moving Points hdu4717
  6. POJ(1195)(单点修改,区间查询)(二维)
  7. Ansible(一) - 入门及安装
  8. PHP抓取网页图片
  9. M-定在下边的区域
  10. Echarts数据可视化grid直角坐标系(xAxis、yAxis),开发全解+完美注释