文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 二分查找
    • 2.2 DP

1. 题目

给你一个数组 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-distance-to-target-color
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 找到下标 i 左右最近的 c 颜色花

2.1 二分查找

class Solution {public:vector<int> shortestDistanceColor(vector<int>& colors, vector<vector<int>>& queries) {unordered_map<int,set<int>> m;for(int i = 0; i < colors.size(); ++i){m[colors[i]].insert(i);}vector<int> ans(queries.size(), -1);int l, r, dis, i = 0;for(auto& q : queries){if(colors[q[0]] == q[1]){ans[i++] = 0;continue;}auto next = m[q[1]].lower_bound(q[0]);//二分查找r = next==m[q[1]].end() ? INT_MAX : *next-q[0];l = INT_MAX;if(next != m[q[1]].begin()){l = q[0] - *(--next);}dis = min(l, r);ans[i++] = dis==INT_MAX ? -1 : dis;}return ans;}
};

972 ms 114.4 MB

2.2 DP

  • 记住左右两侧的最近花的位置,正反扫描2次
class Solution {public:vector<int> shortestDistanceColor(vector<int>& colors, vector<vector<int>>& queries) {int i, j, n = colors.size(), dis, idx, c;vector<int> pos(4,-1);vector<vector<int>> left(n, vector<int>(4, INT_MAX));vector<vector<int>> right(n, vector<int>(4, INT_MAX));for(i = 0; i < n; ++i){pos[colors[i]] = i;left[i][1] = pos[1]==-1 ? INT_MAX : i-pos[1];left[i][2] = pos[2]==-1 ? INT_MAX : i-pos[2];left[i][3] = pos[3]==-1 ? INT_MAX : i-pos[3];}pos[1] = pos[2] = pos[3] = -1;for(i = n-1; i >= 0; --i){pos[colors[i]] = i;right[i][1] = pos[1]==-1 ? INT_MAX : pos[1]-i;right[i][2] = pos[2]==-1 ? INT_MAX : pos[2]-i;right[i][3] = pos[3]==-1 ? INT_MAX : pos[3]-i;}vector<int> ans(queries.size(), -1);for(i = 0; i < queries.size(); ++i){idx = queries[i][0];c = queries[i][1];dis = min(left[idx][c], right[idx][c]);ans[i] = dis==INT_MAX ? -1 : dis;}return ans;}
};

888 ms 131.7 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1182. 与目标颜色间的最短距离(二分查找/DP)相关推荐

  1. 【leetcode刷题第36天】1231.分享巧克力、1182.与目标颜色的距离

    第三十六天 1231 分享巧克力 你有一大块巧克力,它由一些甜度不完全相同的小块组成.我们用数组 sweetness 来表示每一小块的甜度. 你打算和 K 名朋友一起分享这块巧克力,所以你需要将切割 ...

  2. LeetCode 729. 我的日程安排表 I(set 二分查找)

    文章目录 1. 题目 2. 解题 2.1 set 二分查找 2.2 差分思想 1. 题目 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安 ...

  3. [Golang]力扣Leetcode - 852. 山脉数组的峰顶索引(二分查找)

    [Golang]力扣Leetcode - 852. 山脉数组的峰顶索引(二分查找) 题目:符合下列属性的数组 arr 称为 山脉数组 : arr.length >= 3 存在 i(0 < ...

  4. LeetCode 2187. 完成旅途的最少时间(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间. 每辆公交车可以 连续 完成多趟旅途,也就是说,一辆 ...

  5. LeetCode 1901. 找出顶峰元素 II(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 一个 2D 网格中的 顶峰元素 是指那些 严格大于 其相邻格子(上.下.左.右)的元素. 给你一个 从 0 开始编号 的 m x n 矩阵 mat ,其中 ...

  6. LeetCode 1838. 最高频元素的频数(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 元素的 频数 是该元素在一个数组中出现的次数. 给你一个整数数组 nums 和一个整数 k . 在一步操作中,你可以选择 nums 的一个下标,并将该下标 ...

  7. LeetCode 792. 匹配子序列的单词数(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数. 示例: 输入: S = "abcde" ...

  8. LeetCode 1631. 最小体力消耗路径(DFS + 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 你准备参加一场远足活动.给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row ...

  9. LeetCode 644. 最大平均子段和 II(二分查找)*

    文章目录 1. 题目 2. 解题 2.1 暴力超时 2.2 二分查找 1. 题目 给定一个包含 n 个整数的数组,找到最大平均值的连续子序列,且长度大于等于 k.并输出这个最大平均值. 样例 1: 输 ...

最新文章

  1. 每日一皮:用户“这个项目很容易嘛”~
  2. x86标志位符号表示(PF奇偶位)
  3. 技术无罪?谷歌AI伦理团队负责人被解雇
  4. 数据源名称和 64 位操作系统
  5. python templates_python templates在哪
  6. table 内 下拉列表 被遮挡_一个简洁、有趣的无限下拉方案
  7. python设计---空域增强之图片去噪(中值滤波、均值滤波、高斯滤波、双边滤波)
  8. 字节跳动面试真题:java高级编程考试题及答案
  9. 完工后的决算书范本_工程决算书范本
  10. C语言猜数字游戏代码
  11. WPF打开pdf文件
  12. 教你巧用万用表测量大值电阻
  13. 计算 变异系数 标准差 标准偏差 相关系数 平滑指数 回归系数等C++ 模板类
  14. html5行走的机器人,HTML5 不倒翁体型的机器人
  15. 云中和花木_王者荣耀:体验服英雄重大调整,云中君成野王,妲己射程加强,花木兰重回巅峰...
  16. 破晓传说Boss切屏效果小记
  17. 网络模拟环境 NS-2仿真软件简介
  18. 进入BeOS的花花世界 系列五
  19. 解决CSS样式重复定义带来的冲突问题
  20. 腾讯云数据库产品介绍第四章-

热门文章

  1. wireshark 十六进制过滤_CTF流量分析之wireshark使用
  2. TCP/IP SOCKET HTTP及HTTPS之间的关系
  3. pojo java_Java——POJO总结
  4. 操作系统中常见的进程调度算法
  5. Linux:Access time、 Modify time 、Change time 和 find 命令使用解析
  6. c++远征之继承篇——继承的概念、继承时构造函数/析构函数的先后顺序
  7. bsp的分析(其中使用buildroot文件夹建立rootfs)
  8. c#利用定时器自动备份数据库(mysql)
  9. django中的admin组件之自定义组件的增删改查的完善
  10. sort和qsort函数