मान लीजिए कि हमारे पास एआर नामक संख्याओं की एक सरणी है और एक पूर्णांक 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 :=गिरफ्तारी का आकार
-
मी :=एआर [(एन -1)/2]
-
जोड़े की एक सरणी v परिभाषित करें
-
मैं :=0, जे :=n - 1
-
एक सरणी रिट परिभाषित करें
-
जबकि k गैर-शून्य है, प्रत्येक पुनरावृत्ति में k घटाएं, −
. करें-
x1 :=|arr[j]- m|
-
x2 :=|arr[i]- m|
-
यदि x1>=x2, तो -
-
रिट के अंत में arr[j] डालें
-
(j को 1 से घटाएं)
-
-
अन्यथा
-
रिट के अंत में 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, ]