Skip to content

Commit 413c188

Browse files
authored
feat: add solutions to lc problems: No.2855~2858 (doocs#1639)
* No.2855.Minimum Right Shifts to Sort the Array * No.2856.Minimum Array Length After Pair Removals * No.2857.Count Pairs of Points With Distance k * No.2858.Minimum Edge Reversals So Every Node Is Reachable
1 parent 825f0de commit 413c188

File tree

36 files changed

+2127
-0
lines changed

36 files changed

+2127
-0
lines changed
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
# [2855. 使数组成为递增数组的最少右移次数](https://leetcode.cn/problems/minimum-right-shifts-to-sort-the-array)
2+
3+
[English Version](/solution/2800-2899/2855.Minimum%20Right%20Shifts%20to%20Sort%20the%20Array/README_EN.md)
4+
5+
## 题目描述
6+
7+
<!-- 这里写题目描述 -->
8+
9+
<p>给你一个长度为 <code>n</code>&nbsp;下标从 <strong>0</strong>&nbsp;开始的数组&nbsp;<code>nums</code>&nbsp;,数组中的元素为&nbsp;<strong>互不相同</strong>&nbsp;的正整数。请你返回让 <code>nums</code>&nbsp;成为递增数组的 <strong>最少右移</strong>&nbsp;次数,如果无法得到递增数组,返回 <code>-1</code>&nbsp;。</p>
10+
11+
<p>一次 <strong>右移</strong>&nbsp;指的是同时对所有下标进行操作,将下标为 <code>i</code>&nbsp;的元素移动到下标&nbsp;<code>(i + 1) % n</code>&nbsp;处。</p>
12+
13+
<p>&nbsp;</p>
14+
15+
<p><strong class="example">示例 1:</strong></p>
16+
17+
<pre>
18+
<b>输入:</b>nums = [3,4,5,1,2]
19+
<b>输出:</b>2
20+
<b>解释:</b>
21+
第一次右移后,nums = [2,3,4,5,1] 。
22+
第二次右移后,nums = [1,2,3,4,5] 。
23+
现在 nums 是递增数组了,所以答案为 2 。
24+
</pre>
25+
26+
<p><strong class="example">示例 2:</strong></p>
27+
28+
<pre>
29+
<b>输入:</b>nums = [1,3,5]
30+
<b>输出:</b>0
31+
<b>解释:</b>nums 已经是递增数组了,所以答案为 0 。</pre>
32+
33+
<p><strong class="example">示例 3:</strong></p>
34+
35+
<pre>
36+
<b>输入:</b>nums = [2,1,4]
37+
<b>输出:</b>-1
38+
<b>解释:</b>无法将数组变为递增数组。
39+
</pre>
40+
41+
<p>&nbsp;</p>
42+
43+
<p><strong>提示:</strong></p>
44+
45+
<ul>
46+
<li><code>1 &lt;= nums.length &lt;= 100</code></li>
47+
<li><code>1 &lt;= nums[i] &lt;= 100</code></li>
48+
<li><code>nums</code>&nbsp;中的整数互不相同。</li>
49+
</ul>
50+
51+
## 解法
52+
53+
<!-- 这里可写通用的实现逻辑 -->
54+
55+
**方法一:直接遍历**
56+
57+
我们先用一个指针 $i$ 从左到右遍历数组 $nums$,找出一段连续的递增序列,直到 $i$ 到达数组末尾或者 $nums[i - 1] \gt nums[i]$。接下来我们用另一个指针 $k$ 从 $i + 1$ 开始遍历数组 $nums$,找出一段连续的递增序列,直到 $k$ 到达数组末尾或者 $nums[k - 1] \gt nums[k]$ 且 $nums[k] \gt nums[0]$。如果 $k$ 到达数组末尾,说明数组已经是递增的,返回 $n - i$;否则返回 $-1$。
58+
59+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 是数组 $nums$ 的长度。
60+
61+
<!-- tabs:start -->
62+
63+
### **Python3**
64+
65+
<!-- 这里可写当前语言的特殊实现逻辑 -->
66+
67+
```python
68+
class Solution:
69+
def minimumRightShifts(self, nums: List[int]) -> int:
70+
n = len(nums)
71+
i = 1
72+
while i < n and nums[i - 1] < nums[i]:
73+
i += 1
74+
k = i + 1
75+
while k < n and nums[k - 1] < nums[k] < nums[0]:
76+
k += 1
77+
return -1 if k < n else n - i
78+
```
79+
80+
### **Java**
81+
82+
<!-- 这里可写当前语言的特殊实现逻辑 -->
83+
84+
```java
85+
class Solution {
86+
public int minimumRightShifts(List<Integer> nums) {
87+
int n = nums.size();
88+
int i = 1;
89+
while (i < n && nums.get(i - 1) < nums.get(i)) {
90+
++i;
91+
}
92+
int k = i + 1;
93+
while (k < n && nums.get(k - 1) < nums.get(k) && nums.get(k) < nums.get(0)) {
94+
++k;
95+
}
96+
return k < n ? -1 : n - i;
97+
}
98+
}
99+
```
100+
101+
### **C++**
102+
103+
```cpp
104+
class Solution {
105+
public:
106+
int minimumRightShifts(vector<int>& nums) {
107+
int n = nums.size();
108+
int i = 1;
109+
while (i < n && nums[i - 1] < nums[i]) {
110+
++i;
111+
}
112+
int k = i + 1;
113+
while (k < n && nums[k - 1] < nums[k] && nums[k] < nums[0]) {
114+
++k;
115+
}
116+
return k < n ? -1 : n - i;
117+
}
118+
};
119+
```
120+
121+
### **Go**
122+
123+
```go
124+
func minimumRightShifts(nums []int) int {
125+
n := len(nums)
126+
i := 1
127+
for i < n && nums[i-1] < nums[i] {
128+
i++
129+
}
130+
k := i + 1
131+
for k < n && nums[k-1] < nums[k] && nums[k] < nums[0] {
132+
k++
133+
}
134+
if k < n {
135+
return -1
136+
}
137+
return n - i
138+
}
139+
```
140+
141+
### **TypeScript**
142+
143+
```ts
144+
function minimumRightShifts(nums: number[]): number {
145+
const n = nums.length;
146+
let i = 1;
147+
while (i < n && nums[i - 1] < nums[i]) {
148+
++i;
149+
}
150+
let k = i + 1;
151+
while (k < n && nums[k - 1] < nums[k] && nums[k] < nums[0]) {
152+
++k;
153+
}
154+
return k < n ? -1 : n - i;
155+
}
156+
```
157+
158+
### **...**
159+
160+
```
161+
162+
```
163+
164+
<!-- tabs:end -->
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
# [2855. Minimum Right Shifts to Sort the Array](https://leetcode.com/problems/minimum-right-shifts-to-sort-the-array)
2+
3+
[中文文档](/solution/2800-2899/2855.Minimum%20Right%20Shifts%20to%20Sort%20the%20Array/README.md)
4+
5+
## Description
6+
7+
<p>You are given a <strong>0-indexed</strong> array <code>nums</code> of length <code>n</code> containing <strong>distinct</strong> positive integers. Return <em>the <strong>minimum</strong> number of <strong>right shifts</strong> required to sort </em><code>nums</code><em> and </em><code>-1</code><em> if this is not possible.</em></p>
8+
9+
<p>A <strong>right shift</strong> is defined as shifting the element at index <code>i</code> to index <code>(i + 1) % n</code>, for all indices.</p>
10+
11+
<p>&nbsp;</p>
12+
<p><strong class="example">Example 1:</strong></p>
13+
14+
<pre>
15+
<strong>Input:</strong> nums = [3,4,5,1,2]
16+
<strong>Output:</strong> 2
17+
<strong>Explanation:</strong>
18+
After the first right shift, nums = [2,3,4,5,1].
19+
After the second right shift, nums = [1,2,3,4,5].
20+
Now nums is sorted; therefore the answer is 2.
21+
</pre>
22+
23+
<p><strong class="example">Example 2:</strong></p>
24+
25+
<pre>
26+
<strong>Input:</strong> nums = [1,3,5]
27+
<strong>Output:</strong> 0
28+
<strong>Explanation:</strong> nums is already sorted therefore, the answer is 0.</pre>
29+
30+
<p><strong class="example">Example 3:</strong></p>
31+
32+
<pre>
33+
<strong>Input:</strong> nums = [2,1,4]
34+
<strong>Output:</strong> -1
35+
<strong>Explanation:</strong> It&#39;s impossible to sort the array using right shifts.
36+
</pre>
37+
38+
<p>&nbsp;</p>
39+
<p><strong>Constraints:</strong></p>
40+
41+
<ul>
42+
<li><code>1 &lt;= nums.length &lt;= 100</code></li>
43+
<li><code>1 &lt;= nums[i] &lt;= 100</code></li>
44+
<li><code>nums</code> contains distinct integers.</li>
45+
</ul>
46+
47+
## Solutions
48+
49+
<!-- tabs:start -->
50+
51+
### **Python3**
52+
53+
```python
54+
class Solution:
55+
def minimumRightShifts(self, nums: List[int]) -> int:
56+
n = len(nums)
57+
i = 1
58+
while i < n and nums[i - 1] < nums[i]:
59+
i += 1
60+
k = i + 1
61+
while k < n and nums[k - 1] < nums[k] < nums[0]:
62+
k += 1
63+
return -1 if k < n else n - i
64+
```
65+
66+
### **Java**
67+
68+
```java
69+
class Solution {
70+
public int minimumRightShifts(List<Integer> nums) {
71+
int n = nums.size();
72+
int i = 1;
73+
while (i < n && nums.get(i - 1) < nums.get(i)) {
74+
++i;
75+
}
76+
int k = i + 1;
77+
while (k < n && nums.get(k - 1) < nums.get(k) && nums.get(k) < nums.get(0)) {
78+
++k;
79+
}
80+
return k < n ? -1 : n - i;
81+
}
82+
}
83+
```
84+
85+
### **C++**
86+
87+
```cpp
88+
class Solution {
89+
public:
90+
int minimumRightShifts(vector<int>& nums) {
91+
int n = nums.size();
92+
int i = 1;
93+
while (i < n && nums[i - 1] < nums[i]) {
94+
++i;
95+
}
96+
int k = i + 1;
97+
while (k < n && nums[k - 1] < nums[k] && nums[k] < nums[0]) {
98+
++k;
99+
}
100+
return k < n ? -1 : n - i;
101+
}
102+
};
103+
```
104+
105+
### **Go**
106+
107+
```go
108+
func minimumRightShifts(nums []int) int {
109+
n := len(nums)
110+
i := 1
111+
for i < n && nums[i-1] < nums[i] {
112+
i++
113+
}
114+
k := i + 1
115+
for k < n && nums[k-1] < nums[k] && nums[k] < nums[0] {
116+
k++
117+
}
118+
if k < n {
119+
return -1
120+
}
121+
return n - i
122+
}
123+
```
124+
125+
### **TypeScript**
126+
127+
```ts
128+
function minimumRightShifts(nums: number[]): number {
129+
const n = nums.length;
130+
let i = 1;
131+
while (i < n && nums[i - 1] < nums[i]) {
132+
++i;
133+
}
134+
let k = i + 1;
135+
while (k < n && nums[k - 1] < nums[k] && nums[k] < nums[0]) {
136+
++k;
137+
}
138+
return k < n ? -1 : n - i;
139+
}
140+
```
141+
142+
### **...**
143+
144+
```
145+
146+
```
147+
148+
<!-- tabs:end -->
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
int minimumRightShifts(vector<int>& nums) {
4+
int n = nums.size();
5+
int i = 1;
6+
while (i < n && nums[i - 1] < nums[i]) {
7+
++i;
8+
}
9+
int k = i + 1;
10+
while (k < n && nums[k - 1] < nums[k] && nums[k] < nums[0]) {
11+
++k;
12+
}
13+
return k < n ? -1 : n - i;
14+
}
15+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
func minimumRightShifts(nums []int) int {
2+
n := len(nums)
3+
i := 1
4+
for i < n && nums[i-1] < nums[i] {
5+
i++
6+
}
7+
k := i + 1
8+
for k < n && nums[k-1] < nums[k] && nums[k] < nums[0] {
9+
k++
10+
}
11+
if k < n {
12+
return -1
13+
}
14+
return n - i
15+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public int minimumRightShifts(List<Integer> nums) {
3+
int n = nums.size();
4+
int i = 1;
5+
while (i < n && nums.get(i - 1) < nums.get(i)) {
6+
++i;
7+
}
8+
int k = i + 1;
9+
while (k < n && nums.get(k - 1) < nums.get(k) && nums.get(k) < nums.get(0)) {
10+
++k;
11+
}
12+
return k < n ? -1 : n - i;
13+
}
14+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def minimumRightShifts(self, nums: List[int]) -> int:
3+
n = len(nums)
4+
i = 1
5+
while i < n and nums[i - 1] < nums[i]:
6+
i += 1
7+
k = i + 1
8+
while k < n and nums[k - 1] < nums[k] < nums[0]:
9+
k += 1
10+
return -1 if k < n else n - i
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function minimumRightShifts(nums: number[]): number {
2+
const n = nums.length;
3+
let i = 1;
4+
while (i < n && nums[i - 1] < nums[i]) {
5+
++i;
6+
}
7+
let k = i + 1;
8+
while (k < n && nums[k - 1] < nums[k] && nums[k] < nums[0]) {
9+
++k;
10+
}
11+
return k < n ? -1 : n - i;
12+
}

0 commit comments

Comments
 (0)