สมมติว่าบางคนจะขอเป็นเพื่อน เรารู้อายุของพวกเขา สิ่งเหล่านี้ถูกเก็บไว้ในวัย[i] นี่แสดงว่าอายุของบุคคลนั้น ตอนนี้ A จะไม่ขอเป็นเพื่อนกับบุคคล B (B !=A) หากเงื่อนไขใด ๆ ต่อไปนี้เป็นจริง -
- อายุ[B] <=0.5 * อายุ[A] + 7
- อายุ[B]>อายุ[A]
- อายุ[B]> 100 &&อายุ[A] <100
มิฉะนั้น A จะขอเป็นเพื่อน B. คุณสามารถพิจารณาว่าถ้า A ขอ B, B ไม่จำเป็นต้องขอ A. และคนจะไม่ขอเป็นเพื่อนเอง เราจึงต้องหาว่ามีการขอเป็นเพื่อนทั้งหมดกี่คน?
สมมติว่าอาร์เรย์อายุเท่ากับ [16,17,18] ผลลัพธ์จะเป็น 2 เนื่องจากคำขอจะเป็น 17 -> 16, 18 -> 17
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดที่เก็บข้อมูลอาร์เรย์ขนาด 1000 จากนั้นเก็บความถี่ขององค์ประกอบอาร์เรย์อายุไว้ในที่เก็บข้อมูล
- จากนั้นค้นหาและจัดเก็บผลรวมขององค์ประกอบที่เก็บข้อมูลไว้ในที่เก็บข้อมูล
- ret :=0
- สำหรับฉันอยู่ในช่วง 0 ถึงขนาดอาร์เรย์อายุ – 1
- x :=อายุ[i], y :=(อายุ[i] / 2) + 7
- ถ้า x>=y แล้ว
- ret :=bucket[x] – bucket[y]
- ถ้า bucket[x] – bucket[y] ไม่ใช่ศูนย์ ให้ลดการ ret ลง 1
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#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));
} อินพุต
[16,17,18]
ผลลัพธ์
2