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

C++에서 정렬된 배열의 제곱

<시간/>

정렬된 정수의 주어진 배열에서 작업은 모든 배열 요소의 제곱을 인쇄하고 정렬된 순서로 배열을 인쇄하는 것입니다. 예를 들어,

입력-1 -

arr[ ] = { -3,-1,0,1,4,6 };

출력 -

{0,1,1,9,16, 36}

설명 − 주어진 배열 [-3, -1,0,1,4,6 ]의 각 요소의 제곱은 [0,1,1,9,16,36 ]입니다.

입력-2 -

arr[ ]= { 0,1,2,8,9 }

출력 -

{0,1,4,64,81}

설명 − 주어진 배열 [ 0,1,2,8,9 ]의 각 요소의 제곱은 [ 0,1,4,64,81 ]입니다.

이 문제를 해결하기 위한 접근 방식

이 특정 문제를 해결하기 위해 두 포인터 접근 방식을 사용할 수 있습니다. Two-Pointer에서는 왼쪽과 오른쪽 두 개의 포인터를 사용합니다. 배열의 첫 번째 요소로 초기화된 왼쪽 포인터와 배열의 끝 요소를 가리키는 오른쪽 포인터.

배열의 요소를 반복하는 동안 값의 제곱을 찾고 오른쪽 정수의 제곱이 왼쪽 정수보다 크거나 작은지 확인합니다.

  • 오름차순으로 정수 배열을 입력합니다.

  • 정수 함수 squareAndSort(int *arr, int n)는 입력을 정수 배열로 받아 정렬된 방식으로 배열의 각 요소의 제곱을 반환합니다.

  • 배열의 왼쪽 요소와 가장 오른쪽 요소로 두 개의 포인터를 왼쪽과 오른쪽으로 초기화합니다.

  • 요소의 제곱을 인쇄하고 오른쪽 요소의 제곱과 비교합니다.

  • 그에 따라 왼쪽 및 오른쪽 포인터를 늘리거나 줄입니다.

예시

#include <bits/stdc++.h>
using namespace std;
vector<int> squareAndSort(vector<int>&arr){
   int left= 0;
   int right= arr.size()-1;
   vector<int>vec;
   while(left<=right){
      while(left <= right) {
         int v1 = arr[left]*arr[left];
         int v2 = arr[right]*arr[right];
         if(v1 <= v2) {
            vec.push_back(v2);
            right--;
         }
         else {
            vec.push_back(v1);
            left++;
         }
      }
      reverse(vec.begin(), vec.end());
   }
   return vec;
}
int main(){
   vector<int>arr= {-3,-1,0,1,4,6};
   vector<int>ans= squareAndSort(arr);
   for(auto x:ans){
      cout<<x<<" ";
   }
   return 0;
}

출력

위의 코드를 실행하면 다음과 같이 출력이 생성됩니다.

0 1 1 9 16 36

배열의 각 요소의 제곱은 9,1,0,1,16,36입니다. 이러한 요소를 정렬한 후 출력은 0 1 1 9 16 36이 됩니다.