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

文章目录

    • 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阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java跳转html页面_springboot 2.0.8 跳转html页面

springboot 成功创建了后&#xff0c;继续写一下跳转到html页面的方法, 这里我把 jsp和html 分开两篇文章。然后再写一个两种方式整合的这篇 是跳转到html文件的1创建目录结果和html文件​ 2配置return 返回模版​ 3.UserController.java代码如下&#xff0c;这里就直接使用上…

LeetCode MySQL 1212. 查询球队积分

文章目录1. 题目2. 解题1. 题目 Table: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- 此表的主键是 team_id&#xff0c;表中的每一行都…

js encodeurl java接收_在JS中encodeURI(url)怎样才能不出现乱码?

这次给大家带来在JS中encodeURI(url)怎样才能不出现乱码&#xff1f;&#xff0c;在JS中使用encodeURI(url)的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。一般情况下, 发送 encodeURIComponent(parmeName)""encodeURIComponent(parmeValu…

Google Maps API 简易教程(四)

Google Maps 类型 一、基本地图类型 Google Maps API支持一下map类型&#xff1a; .ROADMAP&#xff08;正式的&#xff0c;默认为2D地图&#xff09; .SATELLITE&#xff08;逼真的地图&#xff09; .HYBRID(逼真地图道路和城市名) .TERRAIN&#xff08;山脉和河流地图等等&am…

LeetCode MySQL 1077. 项目员工 III

文章目录1. 题目2. 解题1. 题目 项目表 Project&#xff1a; ---------------------- | Column Name | Type | ---------------------- | project_id | int | | employee_id | int | ---------------------- (project_id, employee_id) 是这个表的主键 employee_…

Java什么是重用_深度解析:java必须掌握的知识点——类的重用

类继承的概念和语法类继承的概念根据已有类来定义新类,新类拥有已有类的所有功能。Java只支持类的单继承,每个子类只能有一一个直接超类(父类)。超类是所有子类的公共属性及方法的集合&#xff0c;子类则是超类的特殊化。继承机制可以提高程序的抽象程度&#xff0c;提高代码的…

Ajax-基础篇(持续更新01)

1&#xff1a;例子&#xff1a;下面的例子点击按钮会在不更新整个页面的情况下动态更新内容abcdefgchange abcdefg 代码如下&#xff1a; <html> <head> <script type"text/javascript" src"/jquery/jquery.js"></script> <scr…

LeetCode MySQL 1205. 每月交易II(union all)*

文章目录1. 题目2. 解题1. 题目 Transactions 记录表 ------------------------- | Column Name | Type | ------------------------- | id | int | | country | varchar | | state | enum | | amount | int | | trans…

java获取参数编码_java获取接口数据编码问题

需求比较简单&#xff0c;就是获取接口数据并返回。但是在用的过程中发现编码问题。接口返回的数据编码为UTF-8&#xff0c;希望显示的数据也是UTF-8&#xff0c;问题出在从输入流中读取数据的过程中。下面是几个实例程序。1、不管编码&#xff0c;直接写public static String …

opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构

一.基本数据类型&#xff1a; 1.CvPoint 图像中的点 Opevcv提供的数据类型中最简单的就是CvPoint. typedef struct CvPoint { int x; int y; } CvPoint CvPoint包含int x 和int y两个数据成员,它的变体有CvPoint2D32f 和 CvPoint3D32f. CvPoint2D32f包含float x , float y两个…

LeetCode MySQL 614. 二级关注者

文章目录1. 题目2. 解题1. 题目 在 facebook 中&#xff0c;表 follow 会有 2 个字段&#xff1a; followee, follower &#xff0c;分别表示被关注者和关注者。 请写一个 sql 查询语句&#xff0c;对每一个关注者&#xff0c;查询关注他的关注者的数目。 比方说&#xff1a…

PHP安全最大化

PHP安全最大化 php中退出时清除session的问题 今天在做php项目的时候,需要增加安全退出的功能,也就是要求用户点"安全退出"时,执行清除session操作,并转到登录页.没想到在这个地方也小"卡"了一下. 出现的问题是当我点"安全退出"后转到登录…

java中字母用什么单词赋值_Java初学

Java-SUN语言平台J2SE(桌面) ,J2ME(移动被安卓所取代),J2EE(企业主要用于web)1.跨平台(操作系统)原理&#xff1a;在任意操作系统上运行&#xff0c;一次编写到处运行。依赖JVM(Java Virtual Machine)(不同系统Windows&#xff0c;Linux&#xff0c;mac有自己对应的JVM)2. JRE和…

POJ-3590 The shuffle Problem 置换+DP | DFS

题目链接&#xff1a;http://poj.org/problem?id3590 自己暴力给水过去了&#xff0c;不过效率有点低。题目要求的就是给一个数n&#xff0c;要你求出一种方案&#xff0c;一些和为n的数的最小公倍数最大。题目数据量不大&#xff0c;容易想到用暴力的办法求出所用情况&#x…

LeetCode MySQL 1454. 活跃用户(连续dense_rank排名函数)

文章目录1. 题目2. 解题1. 题目 表 Accounts: ------------------------ | Column Name | Type | ------------------------ | id | int | | name | varchar | ------------------------ id 是该表主键. 该表包含账户 id 和账户的用户名.表 Log…

Java随机生成长宽的矩形_java – 将正方形或矩形分解为大量随机大小的正方形或矩形...

提供的代码创建一个k-d tree.您可以使用它在矩形上绘制线条,将其划分为更小的矩形.获得树后,可以按如下方式使用它将区域划分为这些矩形&#xff1a;>在树的根部选择节点.>通过这一点绘制一条垂直线.>选择它的左子,在你刚刚通过它的父线绘制的线左侧的这一点画一条水平…

java自动加空格吗_程序加上空格和不加空格运行结果不一样

已结贴√问题点数&#xff1a;20 回复次数&#xff1a;2程序加上空格和不加空格运行结果不一样程序第六行在教育教学后面加空格结果为全部图书&#xff1a;1.郁达夫随笔&#xff1a;伤感行旅 郁达夫 北京大学出版社 38.02.教育教学 李晓燕 高等教育出…

LeetCode MySQL 585. 2016年的投资(窗口函数over(partition by xx))

文章目录1. 题目2. 解题1. 题目 写一个查询语句&#xff0c;将 2016 年 (TIV_2016) 所有成功投资的金额加起来&#xff0c;保留 2 位小数。 对于一个投保人&#xff0c;他在 2016 年成功投资的条件是&#xff1a; 他在 2015 年的投保额 (TIV_2015) 至少跟一个其他投保人在 2…

黑马程序员---面向对象笔记总结

------- android培训、java培训、期待与您交流&#xff01; ---------- 封装 匿名函数 2--匿名对象使用方式一&#xff0c;当对象的方法只调用一次时&#xff0c;可以用匿名对象完成&#xff0c;这样写比较简单&#xff0c;如果对一个对象进行多个成员必须个这个对象起个名字…

mysql 选择特定的表_MySQL选择具有多个特定列的所有表

我想获取具有3个特定列的所有表名.我想要的是从信息模式中获取所有包含columnA AND columnB AND columnC的表名.目前,我正在使用类似的查询SELECT DISTINCT TABLE_NAMEFROM INFORMATION_SCHEMA.COLUMNSWHERE COLUMN_NAMEcolumnAAND TABLE_SCHEMAmysampledatabase;如何扩展上述查…