สมมติว่าเรามีอาร์เรย์ตัวเลข arr และจำนวนเต็ม k ค่า arr[i] ถือว่า "แข็งแกร่งกว่า" arr[j] เมื่อ |arr[i] - m| > |arr[j] - m| โดย m คือ median ของอาร์เรย์ หากระยะห่างเท่ากัน ค่าที่มากกว่าจะแข็งแกร่งกว่า เราต้องหา k ค่าที่แข็งแกร่งที่สุด
ตัวอย่าง: arr = [1,2,3,4,5], k = 2 median = 3 เรียงตามความแข็งแกร่ง: [5,1,4,2,3] ผลลัพธ์: [5,1]
วิธีแก้ปัญหา
- เรียงอาร์เรย์ arr
- หา median m = arr[(n-1)/2]
- ใช้ two-pointer: i ชี้ซ้าย, j ชี้ขวา
- เปรียบเทียบ |arr[j]-m| กับ |arr[i]-m| ใส่ค่าที่แข็งแกร่งกว่า
- ทำซ้ำ k ครั้ง
ตัวอย่างโค้ด C++
#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];
int i = 0, 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;
}
};
int 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, ]