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

C++에서 대상 색상까지의 최단 거리


1, 2, 3의 세 가지 색상이 있는 배열 색상이 있다고 가정합니다. 몇 가지 쿼리를 제공했습니다. 각 쿼리는 두 개의 정수 i와 c로 구성되며 주어진 인덱스 i와 대상 색상 c 사이의 최단 거리를 찾아야 합니다. 솔루션이 없으면 -1을 반환합니다. 따라서 색상 배열이 [1,1,2,1,3,2,2,3,3]이고 쿼리 배열이 [[1,3], [2,2], [6,1]과 같은 경우 ]], 출력은 [3,0,3]이 됩니다. 이는 인덱스 1에서 가장 가까운 3이 인덱스 4(3단계)에 있기 때문입니다. 그런 다음 인덱스 2에서 가장 가까운 2는 인덱스 2 자체에 있습니다(0단계). 그리고 인덱스 6에서 가장 가까운 1은 인덱스 3(3단계)에 있습니다.

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

  • 4행, n :=색상 배열의 요소 수

    가 있는 인덱스라는 행렬 하나를 만듭니다.
  • 0 ~ n – 1 범위의 I

    • 인덱스[색상[i]]

      에 i 삽입
    • x :=쿼리[i, 0] 및 c :=쿼리[i, 1]

    • index[c]의 크기가 0이면 ret에 -1을 삽입하고 다음 반복을 건너뜁니다.

    • it :=x보다 작지 않은 첫 번째 요소 – index[c]

      의 첫 번째 요소
    • op1 :=무한대, op2 :=무한대

    • =index[c]의 크기라면 1만큼 감소 op1 :=|x – index[c, it]|

    • 그렇지 않으면 =0일 때 op1 :=|x – index[c, it]|

    • 그렇지 않으면 op1 :=|x – index[c, it]|, 1 감소하고 op2 :=|x – index[c, it]|

    • 최소 op1 및 op2를 ret에 삽입

  • 리턴 렛

예시(C++)

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   vector<int> shortestDistanceColor(vector<int>& colors, vector<vector<int>>& queries) {
      vector < vector <int> >idx(4);
      int n = colors.size();
      for(int i = 0; i < n; i++){
         idx[colors[i]].push_back(i);
      }
      vector <int> ret;
      for(int i = 0; i < queries.size(); i++){
         int x = queries[i][0];
         int c = queries[i][1];
         if(idx[c].size() == 0){
            ret.push_back(-1);
            continue;
         }
         int it = lower_bound(idx[c].begin(), idx[c].end() , x) - idx[c].begin();
         int op1 = INT_MAX;
         int op2 = INT_MAX;
         if(it == idx[c].size()){
            it--;
            op1 = abs(x - idx[c][it]);
         }
         else if(it == 0){
            op1 = abs(x - idx[c][it]);
         }
         else{
            op1 = abs(x - idx[c][it]);
            it--;
            op2 = abs(x - idx[c][it]);
         }
         ret.push_back(min(op1, op2));
      }
      return ret;
   }
};
main(){
   vector<int> v = {1,1,2,1,3,2,2,3,3};
   vector<vector<int>> v1 = {{1,3},{2,2},{6,1}};
   Solution ob;
   print_vector(ob.shortestDistanceColor(v, v1));
}

입력

[1,1,2,1,3,2,2,3,3]
[[1,3],[2,2],[6,1]]

출력

[3,0,3]