Giả sử chúng ta có một danh sách các số gọi là nums và một giá trị k. Chúng ta cần tìm số lượng tối thiểu các số cần chèn vào nums sao cho có thể tạo ra bất kỳ số nào trong khoảng [1, k] bằng cách sử dụng một tập con của nums.
Ví dụ, nếu đầu vào là nums = [3, 5], k = 6, thì kết quả sẽ là 2, vì ta phải chèn thêm 1, 2 để có thể tạo ra: 1 = [1], 2 = [2], 3 = [3], 4 = [1, 3], 5 = [5], 6 = [1, 5].
Giải thuật
- Sắp xếp mảng
nums. - Khởi tạo
sum := 0,next := 1,ret := 0. - Duyệt qua từng phần tử
itrongnums:- Trong khi
next < i:- Nếu
sum >= kthì thoát khỏi vòng lặp. sum := sum + nextnext := sum + 1- Tăng
retlên 1.
- Nếu
- Nếu
sum >= kthì thoát khỏi vòng lặp. sum := sum + inext := sum + 1
- Trong khi
- Trong khi
next <= k:sum := sum + nextnext := sum + 1- Tăng
retlên 1.
- Trả về
ret.
Ví dụ triển khai
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int sum = 0;
int next = 1;
int ret = 0;
for (int i : nums) {
while (next < i) {
if (sum >= k) break;
sum += next;
next = sum + 1;
ret++;
}
if (sum >= k) break;
sum += i;
next = sum + 1;
}
while (next <= k) {
sum += next;
next = sum + 1;
ret++;
}
return ret;
}
};
int main() {
vector<int> v = {3, 5};
int k = 6;
cout << solve(v, k);
return 0;
}
Đầu vào
[3, 5], 6
Đầu ra
2