题目链接在这里:https://leetcode-cn.com/problems/shortest-distance-to-target-color/
题目大意
给你一个数组 colors,里面有 1、2、 3 三种颜色。
我们需要在 colors 上进行一些查询操作 queries,其中每个待查项都由两个整数 i 和 c 组成。
现在请你帮忙设计一个算法,查找从索引 i 到具有目标颜色 c 的元素之间的最短距离。
如果不存在解决方案,请返回 -1。
解题方法是使用字典加二分查找。
代码如下:
int cloestToTarget(vector<int> &nums, int target) {
/* 返回第一个大于等于target的值的下标 */
int position = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
/* 第一个值大于等于target */
if (position == 0) {
return nums[0];
}
/* 最后一个值小于target */
if (position == nums.size()) {
return nums[nums.size() - 1];
}
/* 所需找的下标值所在应该是索引position或者position - 1所在的地方 */
if (nums[position] - target < target - nums[position - 1]) {
return nums[position];
}
return nums[position - 1];
}
/*
*Input: colors = [1,1,2,1,3,2,2,3,3], queries = [[1,3],[2,2],[6,1]]
*字典m如下:
*{
*{1: 0, 1, 3},
*{2: 2, 5, 6},
*{3: 4, 7, 8}
*}
*/
vertor<int> shortestDistanceColor(vertor<int> &colors, vertor<vector<int> &queries) {
const int N = clors.size();
unordered_map<int vertor<int>> unorderedMap;
/* 首先使用unordered_map来构建对应字典序列 */
for (int i = 0; i < N; i++) {
unorderedMap[colors[i]].push_back(i);
}
vector<int> result;
for (auto& query : queries) {
int cnt = INT_MAX;
/* 当前的索引值 */
int target = query[0];
/* 若字典中存在要寻找的值 */
if (!unorderedMap.count(query[1])) {
result.push_back(-1);
continue;
}
int position = cloestToTarget(unorderedMap[query[1]], target);
result.push_back(abs(pos - target));
}
return result;
}