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

C++의 역쌍

<시간/>

배열이 있다고 가정하고 이 배열에서 다음 조건을 충족하는 경우 한 쌍(A[i] 및 A[j])을 중요한 역 쌍으로 말할 것입니다. -

  • i 2* nums[j]인 경우

중요한 역쌍의 수를 찾아야 합니다. 따라서 입력이 [2,8,7,7,2]와 같으면 결과는 3이 됩니다.

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

  • ans :=0
  • merge() 함수를 정의하면 배열이 필요합니다(낮음, 중간, 높음)
  • k :=높음 - 낮음 + 1
  • k 크기의 어레이 온도 정의
  • i :=낮음, j =중간 + 1, k :=0
  • 첫 번째 :=중간 + 1
  • i <=mid인 동안 −
    • 처음 <=high이고 a[first] * 2
    • (먼저 1씩 증가)
  • 동안 (j <=high and a[j] <=a[i]), −
    • 온도[k] :=[j]
    • (j를 1씩 증가)
    • (k를 1씩 증가)
  • ans :=ans + 첫 번째 - (중간 + 1)
  • temp[k] :=[i]
  • (i를 1씩 증가)
  • (k를 1씩 증가)
  • j <=high일 때 −
    • 온도[k] :=[j]
    • (k를 1씩 증가)
    • (j를 1씩 증가)
  • k :=0
  • 초기화 i :=낮음, i <=높음일 때 업데이트(i 1 증가), −
    • a[i] :=온도[k]
    • (k를 1씩 증가)
  • calc() 함수를 정의하면 배열이 사용됩니다. 낮음, 높음,
  • 낮으면>=높으면 −
    • 반환
  • 중간 :=낮음 + (높음 - 낮음)/2
  • calc(a, low, mid) 함수 호출
  • calc(a, mid + 1, high) 함수 호출
  • merge(a, low, mid, high) 함수 호출
  • solve() 함수를 정의하면 배열 A가 필요합니다.
  • ans :=0
  • n :=A의 크기
  • calc(A, 0, n - 1) 함수 호출
  • 반환
  • 메인 방법에서 다음을 수행합니다.
  • return call 함수 solve(nums)
  • 이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

    예시

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       int ans = 0;
       void merge(vector <int> &a, lli low, lli mid, lli high){
          lli k = high - low + 1;
          vector <lli> temp(k);
          lli i = low, j = mid + 1;
          k = 0;
          lli first = mid + 1;
          while(i <= mid){
             while(first <= high && (lli)a[first] * 2 < (lli)a[i]) {
                first++;
             }
             while(j <= high && a[j] <= a[i])
             {
                temp[k] = a[j];
                j++;
                k++;
             }
             ans += first - (mid + 1);
             temp[k] = a[i];
             i++;
             k++;
          }
          while(j <= high){
             temp[k] = a[j];
             k++;
             j++;
          }
          k = 0;
          for(lli i = low; i <= high; i++){
             a[i] = temp[k];
             k++;
          }
       }
       void calc(vector <int> &a, lli low, lli high){
          if(low >= high)return;
          lli mid = low + (high - low)/2;
          calc(a, low, mid);
          calc(a, mid + 1, high);
          merge(a, low, mid, high);
       }
       lli solve(vector<int> &A) {
          ans = 0;
          lli n = A.size();
          calc(A, 0, n - 1);
          return ans;
       }
       int reversePairs(vector<int>& nums) {
          return solve(nums);
       }
    };
    main(){
       Solution ob;
       vector<int> v = {2,8,7,7,2};
       cout << (ob.reversePairs(v));
    }

    입력

    {2,8,7,7,2}

    출력

    3