Giả sử một số người sẽ đưa ra yêu cầu kết bạn. Chúng tôi biết tuổi của họ, chúng được lưu trữ theo độ tuổi [i]. Vì vậy, điều này cho biết rằng tuổi của người thứ i. Bây giờ người A sẽ KHÔNG yêu cầu kết bạn với người B (B! =A) nếu bất kỳ điều kiện nào sau đây là đúng -
- tuổi [B] <=0,5 * tuổi [A] + 7
- tuổi [B]> tuổi [A]
- tuổi [B]> 100 &&tuổi [A] <100
Ngược lại, A sẽ yêu cầu B. Bạn có thể xem xét rằng nếu A yêu cầu B, B không nhất thiết phải yêu cầu A. Và cũng có thể, mọi người sẽ không yêu cầu kết bạn của mình. Vì vậy, chúng ta phải tìm xem có bao nhiêu yêu cầu kết bạn được thực hiện?
Giả sử nếu mảng tuổi giống như [16,17,18], thì kết quả sẽ là 2, vì các yêu cầu sẽ là 17 -> 16, 18 -> 17.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Xác định nhóm mảng có kích thước 1000, sau đó lưu trữ tần suất của các phần tử mảng tuổi trong nhóm.
- Sau đó, tìm và lưu trữ tổng tích lũy của các phần tử nhóm vào nhóm
- ret:=0
- cho tôi trong phạm vi từ 0 đến kích thước của mảng độ tuổi - 1
- x:=age [i], y:=(age [i] / 2) + 7
- nếu x> =y, thì
- ret:=bucket [x] - bucket [y]
- nếu bucket [x] - bucket [y] khác 0, thì hãy giảm ret xuống 1
- trả lời lại.
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: int numFriendRequests(vector<int>& ages) { vector <int> bucket(1000); for(int i = 0; i < ages.size(); i++){ bucket[ages[i]]++; } for(int i = 1; i < 1000; i++)bucket[i] += bucket[i - 1]; int ret = 0; for(int i = 0; i < ages.size(); i++){ int x = ages[i]; int y = ((ages[i]) / 2) + 7; if(x >= y){ ret += (bucket[x] - bucket[y]); if((bucket[x] - bucket[y])) ret--; } } return ret; } }; main(){ vector<int> v1 = {16, 17, 18}; Solution ob; cout << (ob.numFriendRequests(v1)); }
Đầu vào
[16,17,18]
Đầu ra
2