1182. 与目标颜色间的最短距离(二分查找)
作者:互联网
1182. 与目标颜色间的最短距离
给你一个数组 colors
,里面有 1
、2
、 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 <= colors.length <= 5*10^4
1 <= colors[i] <= 3
1 <= queries.length <= 5*10^4
queries[i].length == 2
0 <= queries[i][0] < colors.length
1 <= queries[i][1] <= 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