ধরুন আমাদের কাছে arr এবং একটি পূর্ণসংখ্যা k নামক একটি অ্যারে আছে। একটি মান arr[i] আছে যেটিকে arr[j] মানের চেয়ে শক্তিশালী বলা হয় যখন |arr[i] - m|> |arr[j] - m| যেখানে m হল অ্যারের মধ্যমা। যদি |arr[i] - m| |arr[j] - m| এর মতই, তারপর arr[i] কে arr[j] এর চেয়ে শক্তিশালী বলা হয় যদি arr[i]> arr[j] হয়। তাই আমাদের অ্যারের সবচেয়ে শক্তিশালী k মানের একটি তালিকা খুঁজে বের করতে হবে।
সুতরাং, যদি ইনপুট হয় arr =[1,2,3,4,5], k =2, তাহলে আউটপুট হবে [5,1], এর কারণ হল মধ্যমা 3, এবং অ্যারের উপাদানগুলি সাজানো হয়েছে শক্তিশালী দ্বারা হয় [5,1,4,2,3]. এখানে শক্তিশালী 2টি উপাদান হল [5, 1]। [1, 5]ও বৈধ। যদিও |5 - 3| |1 - 3| এর মত কিন্তু 5 1 থেকে শক্তিশালী কারণ 5> 1।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
অ্যারে অ্যারে সাজান
-
n :=arr এর আকার
-
m :=arr[(n - 1)/2]
-
জোড়ার একটি অ্যারে v সংজ্ঞায়িত করুন
-
i :=0, j :=n - 1
-
একটি অ্যারে ret সংজ্ঞায়িত করুন
-
যখন k অ-শূন্য, প্রতিটি পুনরাবৃত্তিতে k হ্রাস করুন, −
করুন-
x1 :=|arr[j]- m|
-
x2 :=|arr[i]- m|
-
x1>=x2 হলে −
-
ret এর শেষে arr[j] ঢোকান
-
(j 1 দ্বারা কমিয়ে দিন)
-
-
অন্যথায়
-
ret এর শেষে arr[i] ঢোকান
-
(i 1 দ্বারা বাড়ান)
-
-
-
রিটার্ন রিটার্ন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
int calc(int x, int m){
return abs(x - m);
}
vector<int> getStrongest(vector<int>& arr, int k) {
sort(arr.begin(), arr.end());
int n = arr.size();
int m = arr[(n - 1) / 2];
vector<pair<int, int> > v;
int i = 0;
int j = n - 1;
vector<int> ret;
while (k--) {
int x1 = calc(arr[j], m);
int x2 = calc(arr[i], m);
if (x1 >= x2) {
ret.push_back(arr[j]);
j--;
}
else {
ret.push_back(arr[i]);
i++;
}
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {1,2,3,4,5};
print_vector(ob.getStrongest(v,2));
} ইনপুট
{1,2,3,4,5},2 আউটপুট
[5, 1, ]