Cho mảng nums đã sắp xếp tăng dần. Xác định có thể chia thành một hoặc nhiều dãy con liên tiếp (mỗi dãy độ dài ≥ 3) hay không.
Ví dụ: [1,2,3,3,4,4,5,5] → true (chia thành [1,2,3,4,5] và [3,4,5]).
Thuật toán (Tham lam + Hash Map)
- Đếm tần suất mỗi số trong map
m. - Duyệt mảng, với mỗi
x = nums[i]nếu cònx, x+1, x+2thì tạo dãy mới: - Giảm tần suất
x, x+1, x+2, mở rộng dãy bằng cách thêmx+3, x+4...miễn là tần suất cho phép. - Cuối cùng kiểm tra tất cả phần tử đã được dùng (
cnt == 0).
Mã nguồn C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isPossible(vector<int>& nums) {
unordered_map<int, int> m;
int n = nums.size();
for (int x : nums) m[x]++;
int cnt = n;
for (int i = 0; i < n; i++) {
int x = nums[i];
if (m[x] && m[x+1] && m[x+2]) {
m[x]--; m[x+1]--; m[x+2]--;
x += 3; cnt -= 3;
while (m[x] > 0 && m[x] > m[x-1]) {
m[x]--; cnt--; x++;
}
}
}
return cnt == 0;
}
};
int main() {
vector<int> v = {1,2,3,3,4,4,5,5};
Solution ob;
cout << ob.isPossible(v);
return 0;
}
Đầu vào / Đầu ra
Input: [1,2,3,3,4,4,5,5]
Output: 1 (true)