其他分享
首页 > 其他分享> > 1182. 与目标颜色间的最短距离(二分查找)

1182. 与目标颜色间的最短距离(二分查找)

作者:互联网

1182. 与目标颜色间的最短距离

给你一个数组 colors,里面有  12、 3 三种颜色。

我们需要在 colors 上进行一些查询操作 queries,其中每个待查项都由两个整数 i 和 c 组成。

现在请你帮忙设计一个算法,查找从索引 i 到具有目标颜色 c 的元素之间的最短距离。

如果不存在解决方案,请返回 -1

 

示例 1:

输入:colors = [1,1,2,1,3,2,2,3,3], queries = [[1,3],[2,2],[6,1]]
输出:[3,0,3]
解释: 
距离索引 1 最近的颜色 3 位于索引 4(距离为 3)。
距离索引 2 最近的颜色 2 就是它自己(距离为 0)。
距离索引 6 最近的颜色 1 位于索引 3(距离为 3)。

示例 2:

输入:colors = [1,2], queries = [[0,3]]
输出:[-1]
解释:colors 中没有颜色 3。

 

提示:

 1 class Solution {
 2 public:
 3     // 找出某种颜色所在索引集中距离pos最近的距离
 4     int findNearest(vector<int> &nums, int pos) {
 5         // 不存在这种颜色时返回-1
 6         if (nums.empty()) {
 7             return -1;
 8         }
 9         int left = 0;
10         int right = nums.size() - 1;
11         int result = INT_MAX;
12         while (left <= right) {
13             int mid = left + (right - left) / 2;
14             result = min(result, abs(nums[mid] - pos)); // 取距离pos最近距离
15             if (nums[mid] > pos) { // pos索引在区间[left, mid]
16                 right = mid - 1;
17             } else if (nums[mid] < pos) { // pos索引在区间[mid, right]
18                 left = mid + 1;
19             } else { // colors数组中该种颜色索引数组中存在与起始索引pos相同的,距离最近的就是自己
20                 return 0;
21             }
22         }
23         return result;
24     }
25     vector<int> shortestDistanceColor(vector<int>& colors, vector<vector<int>>& queries) {
26         vector<vector<int>> colorsIndexList(4, vector<int>()); // 三种颜色对应位置的列表
27         for (unsigned int i = 0; i < colors.size(); i++) {
28             colorsIndexList[colors[i]].push_back(i);
29         }
30         vector<int> ans;
31         for (auto &vec : queries) {
32             ans.push_back(findNearest(colorsIndexList[vec[1]], vec[0]));
33         }
34         return ans;
35     }
36 };

标签:二分,颜色,1182,pos,索引,colors,vector,短距离,queries
来源: https://www.cnblogs.com/MGFangel/p/16247646.html