Giả sử chúng ta có một mảng các số nguyên num và một số nguyên dương k, chúng ta phải tìm xem có thể chia mảng này thành các bộ k số liên tiếp hay không. Vì vậy, chúng ta phải trả về True nếu nó có thể, nếu không thì trả về False. Vì vậy, nếu đầu vào là [1,2,3,3,4,4,5,6] và k =4, thì đầu ra sẽ là true. Điều này là do, chúng ta có thể chia mảng sao cho [1,2,3,4] và [3,4,5,6]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Tạo một bản đồ m, đặt n:=kích thước của mảng nums
- cho mỗi phần tử e trong nums
- tăng m [e] thêm 1
- cnt:=0
- sắp xếp mảng nums
- cho tôi trong phạm vi từ 0 đến n
- x:=nums [i]
- nếu m [x - 1] =0 và m [x]> 0
- l:=k
- while k> 0
- nếu m [x]> 0, thì hãy giảm giá trị của m [k] đi 1, nếu không trả về false
- tăng x và cnt lên 1 và giảm k đi 1
- k:=l
- trả về true khi cnt =n, ngược lại là false
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h> using namespace std; class Solution { public: bool isPossibleDivide(vector<int>& nums, int k) { map <int, int> m; int n = nums.size(); for(int i = 0; i < n; i++){ m[nums[i]]++; } int cnt = 0; sort(nums.begin(), nums.end()); for(int i = 0; i < n; i++){ int x = nums[i]; if(m[x - 1] == 0 && m[x] > 0){ int l = k; while(k>0){ if(m[x] > 0){ m[x]--; } else return false; x++; k--; cnt++; } k = l; } } return cnt == n; } }; main(){ vector<int> v = {1,2,3,3,4,4,5,6}; Solution ob; cout << (ob.isPossibleDivide(v, 4)); }
Đầu vào
[1,2,3,3,4,4,5,6] 4
Đầu ra
1