哈希表题目:判断路径是否相交

news2024/9/21 20:36:20

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:判断路径是否相交

出处:1496. 判断路径是否相交

难度

3 级

题目描述

要求

给你一个字符串 path \texttt{path} path,其中 path[i] \texttt{path[i]} path[i] 的值可以是 ‘N’ \texttt{`N'} ‘N’ ‘S’ \texttt{`S'} ‘S’ ‘E’ \texttt{`E'} ‘E’ ‘W’ \texttt{`W'} ‘W’,分别表示向北、向南、向东、向西移动一个单位。你从二维平面上的原点 (0,   0) \texttt{(0, 0)} (0, 0) 处开始出发,按 path \texttt{path} path 所指示的路径行走。

如果路径在任何位置上与自身相交,也就是走到之前已经走过的位置,请返回 true \texttt{true} true;否则,返回 false \texttt{false} false

示例

示例 1:

示例 1

输入: path   =   "NES" \texttt{path = "NES"} path = "NES"
输出: false \texttt{false} false
解释:该路径没有在任何位置相交。

示例 2:

示例 2

输入: path   =   "NESWW" \texttt{path = "NESWW"} path = "NESWW"
输出: true \texttt{true} true
解释:该路径经过原点两次。

数据范围

  • 1 ≤ path.length ≤ 10 4 \texttt{1} \le \texttt{path.length} \le \texttt{10}^\texttt{4} 1path.length104
  • path[i] \texttt{path[i]} path[i] ‘N’ \texttt{`N'} ‘N’ ‘S’ \texttt{`S'} ‘S’ ‘E’ \texttt{`E'} ‘E’ ‘W’ \texttt{`W'} ‘W’

解法一

思路和算法

判断路径是否相交,等价于判断是否存在到达超过一次的位置,可以使用哈希集合存储到达过的位置。

在二维平面内,每个位置由横坐标和纵坐标共同决定,哈希集合中的元素需要同时包含横坐标和纵坐标的信息。

一种做法是使用长度为 2 2 2 的数组记录横坐标和纵坐标。由于数组本身不能判断是否重复,需要将数组转成字符串。

初始坐标是 ( 0 , 0 ) (0, 0) (0,0)。将初始坐标加入哈希集合,然后遍历 path \textit{path} path,对于每个字符,计算移动之后到达的坐标并加入哈希集合,如果存在一个到达的坐标已经在哈希集合中,则该坐标位置到达超过一次,路径相交,返回 true \text{true} true。如果遍历结束之后没有遇到同一个坐标位置到达超过一次,返回 false \text{false} false

代码

class Solution {
    public boolean isPathCrossing(String path) {
        int x = 0, y = 0;
        Set<String> visited = new HashSet<String>();
        visited.add(Arrays.toString(new int[]{x, y}));
        int length = path.length();
        for (int i = 0; i < length; i++) {
            char c = path.charAt(i);
            switch (c) {
            case 'N':
                y++;
                break;
            case 'S':
                y--;
                break;
            case 'E':
                x++;
                break;
            case 'W':
                x--;
                break;
            }
            if (!visited.add(Arrays.toString(new int[]{x, y}))) {
                return true;
            }
        }
        return false;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串 path \textit{path} path 的长度。需要遍历路径一次,对于每次移动需要计算到达的下标并加入哈希集合。这里假设存入哈希集合的字符串的长度是常数,哈希集合的每次操作的时间是 O ( 1 ) O(1) O(1),实际运行时字符串在哈希集合中的操作所需时间和空间都较高。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串 path \textit{path} path 的长度。需要使用哈希集合存储到达的下标,最多需要存储 n + 1 n + 1 n+1 个下标。这里假设存入哈希集合的字符串的长度是常数,哈希集合的每次操作的时间是 O ( 1 ) O(1) O(1),实际运行时字符串在哈希集合中的操作所需时间和空间都较高。

解法二

思路和算法

为了避免字符串操作,可以自定义哈希函数,将坐标转成整数。哈希函数应满足相同的坐标得到的哈希值相同,不同的坐标得到的哈希值不同。

由于 path \textit{path} path 的长度最大为 1 0 4 10^4 104,因此横坐标和纵坐标的取值范围都是 [ − 1 0 4 , 1 0 4 ] [-10^4, 10^4] [104,104],各有 20001 20001 20001 种可能的取值。可以定义哈希函数为 f ( x , y ) = x × 20001 + y f(x, y) = x \times 20001 + y f(x,y)=x×20001+y,该哈希函数可以确保不同的坐标得到的哈希值不同。

假设存在整数坐标 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 满足 f ( x 1 , y 1 ) = f ( x 2 , y 2 ) f(x_1, y_1) = f(x_2, y_2) f(x1,y1)=f(x2,y2),则有 x 1 × 20001 + y 1 = x 2 × 20001 + y 2 x_1 \times 20001 + y_1 = x_2 \times 20001 + y_2 x1×20001+y1=x2×20001+y2,即 20001 ( x 1 − x 2 ) = y 2 − y 1 20001(x_1 - x_2) = y_2 - y_1 20001(x1x2)=y2y1。由于 ∣ x 1 − x 2 ∣ ≤ 20000 |x_1 - x_2| \le 20000 x1x220000 ∣ y 2 − y 1 ∣ ≤ 20000 |y_2 - y_1| \le 20000 y2y120000,且坐标都是整数,因此一定有 x 1 − x 2 = y 2 − y 1 = 0 x_1 - x_2 = y_2 - y_1 = 0 x1x2=y2y1=0 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 是相同的坐标。

使用自定义哈希函数表示坐标,虽然时间复杂度和空间复杂度都与解法一相同(将解法一的哈希集合操作的时间和空间看成常数),但是实际运行时的性能会更好。

代码

class Solution {
    public boolean isPathCrossing(String path) {
        int x = 0, y = 0;
        Set<Integer> visited = new HashSet<Integer>();
        visited.add(getHash(x, y));
        int length = path.length();
        for (int i = 0; i < length; i++) {
            char c = path.charAt(i);
            switch (c) {
            case 'N':
                y++;
                break;
            case 'S':
                y--;
                break;
            case 'E':
                x++;
                break;
            case 'W':
                x--;
                break;
            }
            if (!visited.add(getHash(x, y))) {
                return true;
            }
        }
        return false;
    }

    public int getHash(int x, int y) {
        return x * 20001 + y;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串 path \textit{path} path 的长度。需要遍历路径一次,对于每次移动需要计算到达的下标并加入哈希集合。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串 path \textit{path} path 的长度。需要使用哈希集合存储到达的下标,最多需要存储 n + 1 n + 1 n+1 个下标。

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

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

相关文章

【软考系统架构设计师】2022下案例分析历年真题

【软考系统架构设计师】2022下案例分析历年真题 【软考系统架构设计师】2022下案例分析历年真题【软考系统架构设计师】2022下案例分析历年真题2022下案例分析历年真题第一题&#xff08;25分&#xff09;2022下案例分析历年真题第二题&#xff08;25分&#xff09;2022下案例分…

使用纹理(Textures)

当物体表面并非是纯色的时候&#xff0c;比如带波点&#xff0c;斑纹或者表面有刮痕或被裂纹等&#xff0c;这些效果该如何实现呢&#xff1f; 这里我们需要提到一个概念是贴图&#xff08;Maps&#xff09;。Maps是覆盖在游戏物体上的2D图片&#xff0c;用来设置表面的颜色、s…

大数据-学习实践-1相关Linux

大数据-学习实践-1相关Linux (大数据系列) 文章目录大数据-学习实践-1相关Linux1知识点2具体内容2.1安装、使用2.2高级命令2.2.1文件2.2.2日期2.2.3进程2.2.4三剑客 (grep、sed、awk)2.3高级配置2.3.1分配IP&#xff1a;静态IP设置2.3.2起名&#xff08;hostname&#xff09;&…

工程经验:残差连接对网络训练的巨大影响

文章目录1、没有使用残差连接的网络难以训练2、loss 不下降的原因3、使用了残差连接的网络可以高效训练1、没有使用残差连接的网络难以训练 经典的 SegNet 网络结构如下&#xff1a; 在使用上图所示的 SegNet 作为噪声预测网络训练扩散模型&#xff08;DDPM&#xff09;时&…

Elasticsearch汉字补全和智能纠错使用详解

1 使用ES实现的效果 汉字补全 拼写纠错

Python自动化测试【软件测试最全教程(附笔记、学习路线)】,看完即就业

最近看到很多粉丝在后台私信我&#xff0c;叫我做一期Python自动化测试的教程&#xff0c;其实关于这个问题&#xff0c;我也早就在着手准备了&#xff0c;我录制了一整套完整的Python自动化测试的教程&#xff0c;上传到网盘里了&#xff0c;大家有兴趣的可以去文末交流群免费…

[架构之路-107]-《软考-系统架构设计师》-0-系统分析师与系统架构设计师简介与官网介绍

官网链接&#xff1a;https://www.ruankao.org.cn/index/ind计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试简介计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;以下简称计算机软件资格考试&#xff09;是原中国计算机软件专业技术…

化学试剂Glutaric Acid-PEG-Glutaric Acid,GA-PEG-GA,戊二酸-聚乙二醇-戊二酸

一&#xff1a;产品描述 1、名称 英文&#xff1a;Glutaric Acid-PEG-Glutaric Acid&#xff0c;GA-PEG-GA 中文&#xff1a;戊二酸-聚乙二醇-戊二酸 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Carboxylic acid PEG 4、分子量&#xff1a;可定制&#xff0c; 戊…

如果网站的 Cookie 特别多特别大,会发生什么(一)

有没有想过&#xff0c;如果网站的 Cookie 特别多特别大&#xff0c;会发生什么情况&#xff1f; 不多说&#xff0c;马上来试验一下&#xff1a; for (i 0; i < 20; i) document.cookie i X.repeat(2000) 什么&#xff0c;网站居然报错了&#xff1f; 众所周知&am…

【Unity VR开发】结合VRTK4.0:自身移动(滑动)

语录&#xff1a; 依山傍水房树间&#xff0c;行也安然&#xff0c;住也安然&#xff1b; 一条耕牛半顷田&#xff0c;收也凭天&#xff0c;荒也凭天&#xff1b; 雨过天晴驾小船&#xff0c;鱼在一边&#xff0c;酒在一边&#xff1b; 夜晚妻子话灯前&#xff0c;今也谈谈…

考研复试机试 | C++

目录1.盛水最多的容器<11>题目代码&#xff1a;2.整数转罗马数字题目&#xff1a;代码&#xff1a;3. 清华大学机试题 abc题目题解4.清华大学机试题 反序数题目描述代码对称平方数题目代码&#xff1a;5. 杭电上机题 叠筐题目&#xff1a;代码pass&#xff1a;关于清华大…

Windows server——部署DNS服务(3)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.管理DNS服务 1.子域 案例 2. 委派 案例 1&#xff09;添加主机记录 …

替代AG9300|替代NCS8823|CS5260 Type-C转VGA视频转换方案

替代AG9300|替代NCS8823|CS5260 Type-C转VGA视频转换方案 CS5260是一款是一款实现USB TYPE-C到VGA视频转换的单片机解决方案转换器。CS5260支持USB Type-C显示端口交替模式&#xff0c;CS5260可以将视频和音频流从USB Type-C接口传输到VGA端口。在CS5260芯片中&#xff0c;显示…

01设计模式相关理论

设计模式git代码地址 设计模式分类 创建型模式 用于描述“怎样创建对象”&#xff0c;它的主要特点是“将对象的创建与使用分离”。GoF&#xff08;四人组&#xff09;书中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。结构型模式 用于描述如何将类或对象…

SQL注入Getshell的奇思妙想(下)

前言 由于笔者发现大量的hr面试官都喜欢从SQL注入开始询问&#xff0c;所以留心了一下关于SQL注入的问题的频率。结果非常amazing啊&#xff01;不出意外的是–os- shell名列榜首。 但是啊由于我们不能被面试官所引导&#xff0c;这样太被动啦&#xff01;我们应该引导hr问我们…

某财税集团:使用进步的技术,对业务降本提效

文 / OceanBase解决方案架构师 韩冰 该企业成立于 1999 年&#xff0c;是国内领先的财税信息化综合服务提供商&#xff0c;主要为税务机关提供税务系统开发与运维&#xff0c;为纳税企业和财税中介提供互联网财税综合服务。 经过多年发展&#xff0c;为了更好地支撑用户业务需…

10- SVM支持向量机 (SVC) (机器学习)

支持向量机&#xff08;support vector machines,SVM&#xff09;是一种二分类算法&#xff0c;它的目的是寻找一个超平面来对样本进行分割&#xff0c;分割的原则是间隔最大化&#xff0c;如果对应的样本特征少&#xff0c;一个普通的 SVM 就是一条线将样本分隔开&#xff0c;…

小红书穿搭博主推广费用是多少?

小红书作为一个种草属性非常强的平台&#xff0c;商业价值是有目共睹的。很多爱美的女性都会在小红书上被种草某个商品&#xff0c;所以很多服装品牌都会在小红书上布局推广。 穿搭作为小红书的顶梁柱类目&#xff0c;刷小红书就能总是看到好看的穿搭博主分享美美的衣服&#…

【优化】Nginx设置浏览器缓存

【优化】Nginx设置浏览器缓存 设置缓存 d代表天 h代表小时 -1代表不设置缓存 location ^~ / {root /www/wwwroot/com;index index.html index.htm;location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|svg)${expires 30d;error_log /dev/null;access_log /dev/null;}if ($…

【成为架构师课程系列】怎样进行概念架构(Conceptual Architecture)?

目录 前言 什么是概念架构 概念架构阶段的3个步骤 初步设计 高层分割 分层式概念服务架构 Layer:逻辑层 Tier: 物理层 按通用性分层 技术堆叠 考虑非功能需求 【禅与计算机程序设计艺术&#xff1a;更多阅读】 前言 胜兵先胜而后求战&#xff0c;败兵先站而后求胜。…