Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 배열에서 가장 강력한 k 값

<시간/>

arr이라는 숫자 배열과 정수 k가 있다고 가정합니다. |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보다 강합니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 배열 정렬 arr

  • n :=arr의 크기

  • m :=arr[(n - 1)/2]

  • 쌍의 배열 v 정의

  • i :=0, j :=n - 1

  • ret 배열 정의

  • k가 0이 아닌 동안 각 반복에서 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, ]