Skip to content

Commit 4b6d091

Browse files
committed
581.最短无序连续子数组,排序,单调
1 parent bddee6a commit 4b6d091

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
538. 把二叉搜索树转换为累加树
8787
543. 二叉树的直径
8888
560. 和为 K 的子数组
89+
581. 最短无序连续子数组
8990
583. 两个字符串的删除操作
9091
589. N叉树的前序遍历
9192
617. 合并二叉树

leetcode_Java/Solution0581.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// 581. 最短无序连续子数组
2+
3+
4+
/*
5+
排序:拷贝数组并排序,从左右到中间,比较两个数组元素不同的位置,得到无序子数组的左右边界,左右边界差值即为最短无序连续子数组的长度
6+
*/
7+
class Solution {
8+
public int findUnsortedSubarray(int[] nums) {
9+
if (isSorted(nums)) {
10+
return 0;
11+
}
12+
int n = nums.length;
13+
int[] newNums = Arrays.copyOf(nums, n);
14+
Arrays.sort(newNums);
15+
int left = 0, right = n - 1;
16+
while (nums[left] == newNums[left]) {
17+
left++;
18+
}
19+
while (nums[right] == newNums[right]) {
20+
right--;
21+
}
22+
return right - left + 1;
23+
}
24+
25+
private boolean isSorted(int[] nums) {
26+
for (int i = 0; i < nums.length - 1; i++) {
27+
if (nums[i] > nums[i + 1]) {
28+
return false;
29+
}
30+
}
31+
return true;
32+
}
33+
}
34+
35+
36+
/*
37+
1、假设把数组分成三段,左段和右段是标准的升序数组,中段数组虽是无序的,但满足最小值大于等于左段的最大值,最大值小于等于右段的最小值
38+
2、需要找到中段的左右边界
39+
1)从左到右遍历,动态维护当前最大值max,那么最后一个小于max的元素位置就是右边界(如果大于等于max就会归于右段)
40+
2)从右到左遍历,动态维护当前最小值min,那么最后一个大于min的元素位置就是左边界(如果小于等于min就会归于左段)
41+
3、左右边界差值就是最短无序连续子数组的长度
42+
43+
左段 中段 右段
44+
1 2 3 4 6 4 7 5 7 4 7 8 9
45+
↑ ↑ ↑ ↑
46+
begin min max end
47+
*/
48+
class Solution {
49+
public int findUnsortedSubarray(int[] nums) {
50+
int n = nums.length;
51+
int min = nums[n - 1], max = nums[0];
52+
int begin = 0, end = -1;
53+
for (int i = 0; i < n; i++) {
54+
if (nums[i] < max) {
55+
end = i;
56+
} else {
57+
max = nums[i];
58+
}
59+
if (nums[n - i - 1] > min) {
60+
begin = n - i - 1;
61+
} else {
62+
min = nums[n - i - 1];
63+
}
64+
}
65+
return end - begin + 1;
66+
}
67+
}

0 commit comments

Comments
 (0)