Skip to content

Commit c0b7c51

Browse files
committed
feat: update solutions to lc problem: No.0581
No.0581.Shortest Unsorted Continuous Subarray
1 parent f7b1900 commit c0b7c51

File tree

6 files changed

+129
-88
lines changed

6 files changed

+129
-88
lines changed

solution/0500-0599/0581.Shortest Unsorted Continuous Subarray/README.md

+53-17
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,13 @@
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58-
将排序后的数组与原数组进行比较,确定左右边界。更进一步优化,可以通过维护最大值和最小值,一次遍历得出结果(见 Golang 解法)
58+
**方法一:排序**
59+
60+
将排序后的数组与原数组进行比较,确定左右边界。
61+
62+
时间复杂度 $O(nlogn)$,其中 $n$ 表示 $nums$ 数组的长度。
63+
64+
更进一步优化,可以通过维护最大值和最小值,一次遍历得出结果(见 Golang 解法)
5965

6066
<!-- tabs:start -->
6167

@@ -66,14 +72,13 @@
6672
```python
6773
class Solution:
6874
def findUnsortedSubarray(self, nums: List[int]) -> int:
69-
n = len(nums)
70-
numsSorted = sorted(nums)
71-
left, right = 0, n - 1
72-
while left < n and nums[left] == numsSorted[left]:
75+
arr = sorted(nums)
76+
left, right = 0, len(nums) - 1
77+
while left <= right and nums[left] == arr[left]:
7378
left += 1
74-
while right >= 0 and nums[right] == numsSorted[right]:
79+
while left <= right and nums[right] == arr[right]:
7580
right -= 1
76-
return 0 if right == -1 else right - left + 1
81+
return right - left + 1
7782
```
7883

7984
### **Java**
@@ -83,24 +88,55 @@ class Solution:
8388
```java
8489
class Solution {
8590
public int findUnsortedSubarray(int[] nums) {
86-
int n = nums.length;
87-
int[] numsSorted = new int[n];
88-
System.arraycopy(nums, 0, numsSorted, 0, n);
89-
Arrays.sort(numsSorted);
90-
int left = 0, right = n - 1;
91-
while (left < n && nums[left] == numsSorted[left]) {
92-
left++;
91+
int[] arr = nums.clone();
92+
Arrays.sort(arr);
93+
int left = 0, right = nums.length - 1;
94+
while (left <= right && nums[left] == arr[left]) {
95+
++left;
9396
}
94-
while (right >= 0 && nums[right] == numsSorted[right]) {
95-
right--;
97+
while (left <= right && nums[right] == arr[right]) {
98+
--right;
9699
}
97-
return right == -1 ? 0 : right - left + 1;
100+
return right - left + 1;
98101
}
99102
}
100103
```
101104

105+
### **C++**
106+
107+
```cpp
108+
class Solution {
109+
public:
110+
int findUnsortedSubarray(vector<int>& nums) {
111+
vector<int> arr = nums;
112+
sort(arr.begin(), arr.end());
113+
int left = 0, right = arr.size() - 1;
114+
while (left <= right && nums[left] == arr[left]) ++left;
115+
while (left <= right && nums[right] == arr[right]) --right;
116+
return right - left + 1;
117+
}
118+
};
119+
```
120+
102121
### **Go**
103122
123+
```go
124+
func findUnsortedSubarray(nums []int) int {
125+
n := len(nums)
126+
arr := make([]int, n)
127+
copy(arr, nums)
128+
sort.Ints(arr)
129+
left, right := 0, n-1
130+
for left <= right && nums[left] == arr[left] {
131+
left++
132+
}
133+
for left <= right && nums[right] == arr[right] {
134+
right--
135+
}
136+
return right - left + 1
137+
}
138+
```
139+
104140
```go
105141
func findUnsortedSubarray(nums []int) int {
106142
n := len(nums)

solution/0500-0599/0581.Shortest Unsorted Continuous Subarray/README_EN.md

+46-16
Original file line numberDiff line numberDiff line change
@@ -51,39 +51,69 @@
5151
```python
5252
class Solution:
5353
def findUnsortedSubarray(self, nums: List[int]) -> int:
54-
n = len(nums)
55-
numsSorted = sorted(nums)
56-
left, right = 0, n - 1
57-
while left < n and nums[left] == numsSorted[left]:
54+
arr = sorted(nums)
55+
left, right = 0, len(nums) - 1
56+
while left <= right and nums[left] == arr[left]:
5857
left += 1
59-
while right >= 0 and nums[right] == numsSorted[right]:
58+
while left <= right and nums[right] == arr[right]:
6059
right -= 1
61-
return 0 if right == -1 else right - left + 1
60+
return right - left + 1
6261
```
6362

6463
### **Java**
6564

6665
```java
6766
class Solution {
6867
public int findUnsortedSubarray(int[] nums) {
69-
int n = nums.length;
70-
int[] numsSorted = new int[n];
71-
System.arraycopy(nums, 0, numsSorted, 0, n);
72-
Arrays.sort(numsSorted);
73-
int left = 0, right = n - 1;
74-
while (left < n && nums[left] == numsSorted[left]) {
75-
left++;
68+
int[] arr = nums.clone();
69+
Arrays.sort(arr);
70+
int left = 0, right = nums.length - 1;
71+
while (left <= right && nums[left] == arr[left]) {
72+
++left;
7673
}
77-
while (right >= 0 && nums[right] == numsSorted[right]) {
78-
right--;
74+
while (left <= right && nums[right] == arr[right]) {
75+
--right;
7976
}
80-
return right == -1 ? 0 : right - left + 1;
77+
return right - left + 1;
8178
}
8279
}
8380
```
8481

82+
### **C++**
83+
84+
```cpp
85+
class Solution {
86+
public:
87+
int findUnsortedSubarray(vector<int>& nums) {
88+
vector<int> arr = nums;
89+
sort(arr.begin(), arr.end());
90+
int left = 0, right = arr.size() - 1;
91+
while (left <= right && nums[left] == arr[left]) ++left;
92+
while (left <= right && nums[right] == arr[right]) --right;
93+
return right - left + 1;
94+
}
95+
};
96+
```
97+
8598
### **Go**
8699
100+
```go
101+
func findUnsortedSubarray(nums []int) int {
102+
n := len(nums)
103+
arr := make([]int, n)
104+
copy(arr, nums)
105+
sort.Ints(arr)
106+
left, right := 0, n-1
107+
for left <= right && nums[left] == arr[left] {
108+
left++
109+
}
110+
for left <= right && nums[right] == arr[right] {
111+
right--
112+
}
113+
return right - left + 1
114+
}
115+
```
116+
87117
```go
88118
func findUnsortedSubarray(nums []int) int {
89119
n := len(nums)
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,11 @@
1-
// i自左向右找到第一个逆序,
2-
// j自右向左找到第一个逆序
3-
// 找到nums[i, j]的上下界
4-
// ij向外扩展找到满足上下界的最小[i, j]
5-
class Solution {
1+
class Solution {
62
public:
73
int findUnsortedSubarray(vector<int>& nums) {
8-
if (1 == nums.size())
9-
return 0 ;
10-
11-
int i = 0, j = nums.size()-1 ;
12-
while (i < j && nums[i] <= nums[i+1])
13-
++i ;
14-
if (i >= j)
15-
return 0 ;
16-
17-
while (nums[j-1] <= nums[j])
18-
--j ;
19-
20-
//cout << i << ' ' << j << endl ;
21-
int m = nums[i] ;
22-
int M = m ;
23-
for (int k = i; k <= j; ++k)
24-
{
25-
if (m > nums[k])
26-
m = nums[k] ;
27-
if (M < nums[k])
28-
M = nums[k] ;
29-
}
30-
//cout << m << ' ' << M << endl ;
31-
32-
while (i >= 0 && m < nums[i])
33-
--i ;
34-
while (j < nums.size() && M > nums[j])
35-
++j ;
36-
37-
//cout << i << ' ' << j << endl ;
38-
return j-i-1 ;
4+
vector<int> arr = nums;
5+
sort(arr.begin(), arr.end());
6+
int left = 0, right = arr.size() - 1;
7+
while (left <= right && nums[left] == arr[left]) ++left;
8+
while (left <= right && nums[right] == arr[right]) --right;
9+
return right - left + 1;
3910
}
4011
};
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
class Solution {
22
public int findUnsortedSubarray(int[] nums) {
3-
int n = nums.length;
4-
int[] numsSorted = new int[n];
5-
System.arraycopy(nums, 0, numsSorted, 0, n);
6-
Arrays.sort(numsSorted);
7-
int left = 0, right = n - 1;
8-
while (left < n && nums[left] == numsSorted[left]) {
9-
left++;
3+
int[] arr = nums.clone();
4+
Arrays.sort(arr);
5+
int left = 0, right = nums.length - 1;
6+
while (left <= right && nums[left] == arr[left]) {
7+
++left;
108
}
11-
while (right >= 0 && nums[right] == numsSorted[right]) {
12-
right--;
9+
while (left <= right && nums[right] == arr[right]) {
10+
--right;
1311
}
14-
return right == -1 ? 0 : right - left + 1;
12+
return right - left + 1;
1513
}
16-
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
class Solution:
22
def findUnsortedSubarray(self, nums: List[int]) -> int:
3-
n = len(nums)
4-
numsSorted = sorted(nums)
5-
left, right = 0, n - 1
6-
while left < n and nums[left] == numsSorted[left]:
3+
arr = sorted(nums)
4+
left, right = 0, len(nums) - 1
5+
while left <= right and nums[left] == arr[left]:
76
left += 1
8-
while right >= 0 and nums[right] == numsSorted[right]:
7+
while left <= right and nums[right] == arr[right]:
98
right -= 1
10-
return 0 if right == -1 else right - left + 1
9+
return right - left + 1

solution/1000-1099/1037.Valid Boomerang/README.md

+9-2
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,16 @@
4242

4343
**方法一:斜率比较**
4444

45-
设三点分别为 $(x_1,y_1)$, $(x_2,y_2)$, $(x_3,y_3)$。
45+
设三点分别为 $(x_1,y_1)$, $(x_2,y_2)$, $(x_3,y_3)$。两点之间斜率计算公式为 $\frac{y_2-y_1}{x_2-x_1}$。
4646

47-
要使得三点不共线,需要满足 $\frac{y_2-y_1}{x_2-x_1}\neq\frac{y_3-y_2}{x_3-x_2}$,变形得 $(y_2-y_1)*(x_3-x_2) \neq (y_3-y_2)*(x_2-x_1)$。
47+
要使得三点不共线,需要满足 $\frac{y_2-y_1}{x_2-x_1}\neq\frac{y_3-y_2}{x_3-x_2}$,我们将式子变形得到 $(y_2-y_1)*(x_3-x_2) \neq (y_3-y_2)*(x_2-x_1)$。
48+
49+
注意:
50+
51+
1. 当两点之间斜率不存在,即 $x_1=x_2$,上述变式仍然成立;
52+
2. 若斜率除法运算比较存在精度问题,同样可以变换为乘法。
53+
54+
时间复杂度 $O(1)$。
4855

4956
<!-- tabs:start -->
5057

0 commit comments

Comments
 (0)