Skip to content

Commit 675a1f8

Browse files
authored
feat: add solutions to lc problem: No.2869 (#1731)
No.2869.Minimum Operations to Collect Elements
1 parent 61eacc3 commit 675a1f8

File tree

9 files changed

+192
-16
lines changed

9 files changed

+192
-16
lines changed

solution/2800-2899/2869.Minimum Operations to Collect Elements/README.md

+66-7
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,31 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
**方法一:逆序遍历**
57+
58+
我们可以逆序遍历数组,每次遍历到的元素如果小于等于 $k$,且没有被添加过,就将其添加到集合中,直到集合中包含了元素 $1$ 到 $k$ 为止。
59+
60+
时间复杂度 $O(n)$,其中 $n$ 是数组 $nums$ 的长度。空间复杂度 $O(k)$。
61+
5662
<!-- tabs:start -->
5763

5864
### **Python3**
5965

6066
<!-- 这里可写当前语言的特殊实现逻辑 -->
6167

6268
```python
63-
69+
class Solution:
70+
def minOperations(self, nums: List[int], k: int) -> int:
71+
is_added = [False] * k
72+
count = 0
73+
n = len(nums)
74+
for i in range(n - 1, -1, -1):
75+
if nums[i] > k or is_added[nums[i] - 1]:
76+
continue
77+
is_added[nums[i] - 1] = True
78+
count += 1
79+
if count == k:
80+
return n - i
6481
```
6582

6683
### **Java**
@@ -73,7 +90,7 @@ class Solution {
7390
boolean[] isAdded = new boolean[k];
7491
int n = nums.size();
7592
int count = 0;
76-
for (int i = n - 1; i >= 0; i--) {
93+
for (int i = n - 1;; i--) {
7794
if (nums.get(i) > k || isAdded[nums.get(i) - 1]) {
7895
continue;
7996
}
@@ -83,28 +100,70 @@ class Solution {
83100
return n - i;
84101
}
85102
}
86-
return n;
87103
}
88104
}
89-
90105
```
91106

92107
### **C++**
93108

94109
```cpp
95-
110+
class Solution {
111+
public:
112+
int minOperations(vector<int>& nums, int k) {
113+
int n = nums.size();
114+
vector<bool> isAdded(n);
115+
int count = 0;
116+
for (int i = n - 1;; --i) {
117+
if (nums[i] > k || isAdded[nums[i] - 1]) {
118+
continue;
119+
}
120+
isAdded[nums[i] - 1] = true;
121+
if (++count == k) {
122+
return n - i;
123+
}
124+
}
125+
}
126+
};
96127
```
97128
98129
### **Go**
99130
100131
```go
101-
132+
func minOperations(nums []int, k int) int {
133+
isAdded := make([]bool, k)
134+
count := 0
135+
n := len(nums)
136+
for i := n - 1; ; i-- {
137+
if nums[i] > k || isAdded[nums[i]-1] {
138+
continue
139+
}
140+
isAdded[nums[i]-1] = true
141+
count++
142+
if count == k {
143+
return n - i
144+
}
145+
}
146+
}
102147
```
103148

104149
### **TypeScript**
105150

106151
```ts
107-
152+
function minOperations(nums: number[], k: number): number {
153+
const n = nums.length;
154+
const isAdded = Array(k).fill(false);
155+
let count = 0;
156+
for (let i = n - 1; ; --i) {
157+
if (nums[i] > k || isAdded[nums[i] - 1]) {
158+
continue;
159+
}
160+
isAdded[nums[i] - 1] = true;
161+
++count;
162+
if (count === k) {
163+
return n - i;
164+
}
165+
}
166+
}
108167
```
109168

110169
### **...**

solution/2800-2899/2869.Minimum Operations to Collect Elements/README_EN.md

+66-7
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,29 @@
4747

4848
## Solutions
4949

50+
**Solution 1: Traverse in Reverse Order**
51+
52+
We can traverse the array in reverse order. For each element encountered during the traversal that is less than or equal to $k$ and has not been added to the set yet, we add it to the set until the set contains elements from $1$ to $k$.
53+
54+
The time complexity is $O(n)$, where $n$ is the length of the array $nums$. The space complexity is $O(k)$.
55+
5056
<!-- tabs:start -->
5157

5258
### **Python3**
5359

5460
```python
55-
61+
class Solution:
62+
def minOperations(self, nums: List[int], k: int) -> int:
63+
is_added = [False] * k
64+
count = 0
65+
n = len(nums)
66+
for i in range(n - 1, -1, -1):
67+
if nums[i] > k or is_added[nums[i] - 1]:
68+
continue
69+
is_added[nums[i] - 1] = True
70+
count += 1
71+
if count == k:
72+
return n - i
5673
```
5774

5875
### **Java**
@@ -63,7 +80,7 @@ class Solution {
6380
boolean[] isAdded = new boolean[k];
6481
int n = nums.size();
6582
int count = 0;
66-
for (int i = n - 1; i >= 0; i--) {
83+
for (int i = n - 1;; i--) {
6784
if (nums.get(i) > k || isAdded[nums.get(i) - 1]) {
6885
continue;
6986
}
@@ -73,28 +90,70 @@ class Solution {
7390
return n - i;
7491
}
7592
}
76-
return n;
7793
}
7894
}
79-
8095
```
8196

8297
### **C++**
8398

8499
```cpp
85-
100+
class Solution {
101+
public:
102+
int minOperations(vector<int>& nums, int k) {
103+
int n = nums.size();
104+
vector<bool> isAdded(n);
105+
int count = 0;
106+
for (int i = n - 1;; --i) {
107+
if (nums[i] > k || isAdded[nums[i] - 1]) {
108+
continue;
109+
}
110+
isAdded[nums[i] - 1] = true;
111+
if (++count == k) {
112+
return n - i;
113+
}
114+
}
115+
}
116+
};
86117
```
87118
88119
### **Go**
89120
90121
```go
91-
122+
func minOperations(nums []int, k int) int {
123+
isAdded := make([]bool, k)
124+
count := 0
125+
n := len(nums)
126+
for i := n - 1; ; i-- {
127+
if nums[i] > k || isAdded[nums[i]-1] {
128+
continue
129+
}
130+
isAdded[nums[i]-1] = true
131+
count++
132+
if count == k {
133+
return n - i
134+
}
135+
}
136+
}
92137
```
93138

94139
### **TypeScript**
95140

96141
```ts
97-
142+
function minOperations(nums: number[], k: number): number {
143+
const n = nums.length;
144+
const isAdded = Array(k).fill(false);
145+
let count = 0;
146+
for (let i = n - 1; ; --i) {
147+
if (nums[i] > k || isAdded[nums[i] - 1]) {
148+
continue;
149+
}
150+
isAdded[nums[i] - 1] = true;
151+
++count;
152+
if (count === k) {
153+
return n - i;
154+
}
155+
}
156+
}
98157
```
99158

100159
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
int minOperations(vector<int>& nums, int k) {
4+
int n = nums.size();
5+
vector<bool> isAdded(n);
6+
int count = 0;
7+
for (int i = n - 1;; --i) {
8+
if (nums[i] > k || isAdded[nums[i] - 1]) {
9+
continue;
10+
}
11+
isAdded[nums[i] - 1] = true;
12+
if (++count == k) {
13+
return n - i;
14+
}
15+
}
16+
}
17+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
func minOperations(nums []int, k int) int {
2+
isAdded := make([]bool, k)
3+
count := 0
4+
n := len(nums)
5+
for i := n - 1; ; i-- {
6+
if nums[i] > k || isAdded[nums[i]-1] {
7+
continue
8+
}
9+
isAdded[nums[i]-1] = true
10+
count++
11+
if count == k {
12+
return n - i
13+
}
14+
}
15+
}

solution/2800-2899/2869.Minimum Operations to Collect Elements/Solution.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ public int minOperations(List<Integer> nums, int k) {
33
boolean[] isAdded = new boolean[k];
44
int n = nums.size();
55
int count = 0;
6-
for (int i = n - 1; i >= 0; i--) {
6+
for (int i = n - 1;; i--) {
77
if (nums.get(i) > k || isAdded[nums.get(i) - 1]) {
88
continue;
99
}
@@ -13,6 +13,5 @@ public int minOperations(List<Integer> nums, int k) {
1313
return n - i;
1414
}
1515
}
16-
return n;
1716
}
1817
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def minOperations(self, nums: List[int], k: int) -> int:
3+
is_added = [False] * k
4+
count = 0
5+
n = len(nums)
6+
for i in range(n - 1, -1, -1):
7+
if nums[i] > k or is_added[nums[i] - 1]:
8+
continue
9+
is_added[nums[i] - 1] = True
10+
count += 1
11+
if count == k:
12+
return n - i
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
function minOperations(nums: number[], k: number): number {
2+
const n = nums.length;
3+
const isAdded = Array(k).fill(false);
4+
let count = 0;
5+
for (let i = n - 1; ; --i) {
6+
if (nums[i] > k || isAdded[nums[i] - 1]) {
7+
continue;
8+
}
9+
isAdded[nums[i] - 1] = true;
10+
++count;
11+
if (count === k) {
12+
return n - i;
13+
}
14+
}
15+
}

0 commit comments

Comments
 (0)