정렬된 정수의 주어진 배열에서 작업은 모든 배열 요소의 제곱을 인쇄하고 정렬된 순서로 배열을 인쇄하는 것입니다. 예를 들어,
입력-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이 됩니다.