ধরুন আমাদের একটি সাজানো অ্যারে আছে, দুটি পূর্ণসংখ্যা k এবং xও দেওয়া আছে, আমাদের সেই অ্যারেতে x-এর নিকটতম উপাদানগুলি খুঁজে বের করতে হবে। ফলাফল ক্রমবর্ধমান ক্রমে সাজানো উচিত. যদি টাই থাকে তবে ছোট উপাদানগুলি সর্বদা পছন্দ করা হয়। সুতরাং ইনপুট যদি হয় [1,2,3,4,5] এবং k =4, x =3, তাহলে আউটপুট হবে [1,2,3,4]
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- ans নামে একটি অ্যারে তৈরি করুন
- নিম্ন সেট করুন :=0, উচ্চ :=অ্যারের আকার – k
- যদিও কম <উচ্চ
- মধ্য :=নিম্ন + (উচ্চ - নিম্ন) /2
- যদি x – arr[mid]> arr[mid + k] – x, তারপর low :=mid + 1, অন্যথায় high :=mid
- আমি নিম্ন থেকে নিম্ন + k
- পরিসরে
- ans অ্যারেতে arr[i] ঢোকান
- উত্তর ফেরত দিন
উদাহরণ(C++)
আসুন আরও ভালোভাবে বোঝার জন্য নিচের বাস্তবায়ন দেখি −
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
vector <int> ans;
int low = 0;
int high = arr.size() - k;
while(low < high){
int mid = low + (high - low)/2;
if(x - arr[mid] > arr[mid + k] - x){
low = mid + 1;
}
else high = mid;
}
for(int i = low ; i < low + k ; i++)ans.push_back(arr[i]);
return ans;
}
};
main(){
Solution ob;
vector<int> v = {1,2,3,4,5};
print_vector(ob.findClosestElements(v, 4, 3));
} ইনপুট
[1,2,3,4,5] 4 3
আউটপুট
[1,2,3,4]