C++ 中目标颜色的最短距离
假设我们有一个名为 color 的数组,其中包含三种颜色: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 步)。
为了解决这个问题,我们将遵循以下步骤:
创建一个名为 index 的矩阵,其中包含 4 行,n := color 数组中元素的数量
对于 I 从 0 到 n – 1 的范围
将 i 插入到 index[colors[i]] 中
x := queries[i, 0] 和 c := queries[i, 1]
如果 index[c] 的大小为 0,则将 -1 插入 ret,并跳过下一个迭代
it := 第一个不小于 x - index[c] 的第一个元素
op1 := 无穷大,op2 := 无穷大
如果 it = index[c] 的大小,则将其减 1,op1 := |x – index[c, it]|
否则,当 it = 0 时,则 op1 := |x – index[c, it]|
否则,op1 := |x – index[c, it]|,将其减 1,op2 := |x – index[c, it]|
将 op1 和 op2 的最小值插入 ret
返回 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]
广告