LeetCode 744, 49, 207

目录

  • 744. 寻找比目标字母大的最小字母
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 49. 字母异位词分组
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 207. 课程表
    • 题目链接
    • 标签
    • 思路
    • 代码

744. 寻找比目标字母大的最小字母

题目链接

744. 寻找比目标字母大的最小字母

标签

数组 二分查找

思路

本题比 基础二分查找 难的一点是 需要处理数组中的重复值,另外需要提前判断目标字母target是否比字符数组letters中最大的字母letters[letters.length - 1]还要大,如果是,则按照题目要求直接返回letters的第一个字符;否则才进行二分查找。

如何处理重复值?可以 在找到与target相同的字符时,不急于返回这个字符,而是继续缩小查询区间

而缩小查询区间的策略与题目的要求有关,如果要找 小于target的字符,则下一轮在 左子区间 查询,最后的右指针right就指向小于target的元素;如果要找 大于target的字符,则下一轮在 右子区间 查询,最后的左指针left就指向大于target的元素

例如对于在letters = ['a', 'a', 'b', 'b', 'c', 'c']中查找大于target = 'b'的字符,有如下的二分查找流程:

开始left = 0, right = 5, mid = 2,发现target == letters[mid],于是下一轮查询右子区间;
此时left = 3, right = 5, mid = 4,发现target < letters[mid],于是下一轮查询左子区间;
此时left = 3, right = 3, mid = 3,发现target == letters[mid],于是下一轮查询右子区间;
此时left = 4, right = 3,有left > right,退出查找。

最后left4,而letters[left]'c',这正是要求查找的字符。

代码

class Solution {public char nextGreatestLetter(char[] letters, char target) {int left = 0, right = letters.length - 1;if (target >= letters[right]) { // 如果letters中没有比target大的字符return letters[0]; // 则返回letters的第一个字符}while (left <= right) {int mid = left + (right - left >> 1);if (target < letters[mid]) { // 若target小于mid指向的元素right = mid - 1; // 则下一轮查找左子区间} else if (target > letters[mid]) { // 若target大于mid指向的元素left = mid + 1; // 则下一轮查找右子区间} else { // 由于不确定mid是否为 最后一个等于target的字符left = mid + 1; // 所以下一轮查找右子区间,而不是急于返回}}// 循环结束后left指向letters中第一个大于target的元素return letters[left];}
}

49. 字母异位词分组

题目链接

49. 字母异位词分组

标签

数组 哈希表 字符串 排序

思路

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。所以字母异位词不关心字符的顺序,只关心 字符的出现次数

所以可以 将字符串中的字符出现次数作为字符串的键,将这个字符串存储到 这个键对应的字符串链表中,即有如此结构Map<Cnt, List<String>>。这里的Cnt是自己实现的数据类型,它内部存储着字符的出现次数,并重写了equals & hashCode方法,可以作为HashMap的键。

将字符串根据不同的字符出现此时分配完之后,将Mapvalues()作为构建ArrayList的参数,构建一个List<List<String>>,并将其返回。

代码

class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<Cnt, List<String>> map = new HashMap<>();for (String str : strs) {Cnt cnt = new Cnt(str); // 获取这个字符串的字符出现次数// 获取cnt对应的字符串链表,如果没有,则创建一个新链表List<String> list = map.computeIfAbsent(cnt, k -> new ArrayList<>());list.add(str); // 将这个字符串放入cnt对应的字符串链表中}// 由map的多个 字符串链表List<String> 构建一个 List<List<String>> 并返回return new ArrayList<>(map.values());}private static class Cnt { // 统计字符串的字符出现次数private int[] key = new int[26];public Cnt(String str) { // 计算字符串str的字符出现次数 并保存for (int i = 0; i < str.length(); i++) {key[str.charAt(i) - 'a']++;}}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Cnt cnt = (Cnt) o;return Arrays.equals(key, cnt.key);}@Overridepublic int hashCode() { // 以统计数组key作为本对象生成的hashCodereturn Arrays.hashCode(key);}}
}

207. 课程表

题目链接

207. 课程表

标签

深度优先搜索 广度优先搜索 图 拓扑排序

思路

要做本题需要对 图论 有一定的了解:

  • 节点:图中的一个点。
  • 边:连通一个点到另一个点。对于 有向图 来说,指向别的节点的节点称为 始点,被指向的节点称为 终点
  • 入度:对于一个节点来说,它的入度就是它作为 终点 的次数。

有向图

例如对于上面这个有向图,有以下的结论:

节点1的入度为0
节点2的入度为1
节点3的入度为1
节点4的入度为1
节点5的入度为1
节点6的入度为1
节点7的入度为1
节点8的入度为1
节点9的入度为1
节点10的入度为4
节点11的入度为1

本题很像 图的拓扑排序入度越小,越靠前。在排序之前,先将所有入度为0的节点加入 队列,然后将队列中的节点移出队列,并把节点所指向的节点的入度减一,当某个节点的入度被减到0时,将它加入队列,重复这样的操作,直到队列为空。如果需要返回拓扑排序的结果,则在将节点移出队列时将其加入到结果链表中即可。

回到本题上,要使用拓扑排序得先构建图,并获取图中每个节点的入度,然后才能进行拓扑排序,在拓扑排序的时候记录移出队列的节点数,如果最终这个数字与图中的节点数不一致,则返回false,否则返回true

图实际上就是一堆边和一堆节点的集合,不过本题解不使用这样的集合,而是将图理解为一堆节点连接的一堆节点,即为List<List<Integer>>结构,外层的List包含了所有的节点,内层的List包含的这个节点指向的所有节点。在构建图时,获取图中的每条边,将边的终点加入 边的始点所指向的节点集合 中。

获取图中每个节点的入度很简单,只需要在构建图时,对于每条边,将终点的入度加一即可。

现在的问题就只剩下如何寻找边了,题目中提到prerequisites[i] = [a, b] 表示如果要学习课程 a必须 先学习课程 b,这句话说明prerequisites[i]数组为图中的一条边,第一个元素为 终点,第二个元素为 始点。

代码

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {// 初始化存储图的数据结构List<List<Integer>> graph = new ArrayList<>();for (int i = 0; i < numCourses; i++) {graph.add(new ArrayList<>());}// 统计每个节点的入度,并构建图int[] inDegree = new int[numCourses]; // 存储每个节点的入度for (int[] pair : prerequisites) {int start = pair[1]; // 始点int end = pair[0]; // 终点List<Integer> toList = graph.get(start); // 获取 始点的 指向节点集合toList.add(end); // 将 终点 加入 始点的 指向节点集合 中inDegree[end]++; // 让终点的入度加一}// 寻找入度为0的节点,初始化队列LinkedList<Integer> queue = new LinkedList<>();for (int i = 0; i < inDegree.length; i++) {if (inDegree[i] == 0) { // 如果索引为i的节点的入度为0queue.offer(i); // 则将索引i放入队列}}// 拓扑排序int cnt = 0; // 统计移出队列的节点while (!queue.isEmpty()) { // 直到队列为空才退出循环cnt++;int start = queue.poll(); // 将节点移出队列,获取始点在graph中的索引List<Integer> toList = graph.get(start); // 获取始点指向的所有终点的索引for (int end : toList) { // 将始点指向的所有终点的入度减一if (--inDegree[end] == 0) { // 当终点的入度减到0时queue.offer(end); // 将其加入队列}}}return cnt == numCourses; // 返回移出队列的节点数 是否等于 节点总数}
}

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

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

相关文章

Java求解百钱买百鸡问题(课堂实例2)

目录 &#x1f495;&#x1f495;引言&#x1f495;&#x1f495; &#x1f60d;&#x1f60d;点关注编程梦想家&#xff08;大学生版&#xff09;-CSDN博客不迷路&#x1f495;&#x1f495; 一、问题背景----百鸡百钱_百度百科 (baidu.com) &#x1d465;&#x1d466;&a…

黑马点评报错@user_script:17: user_script:17: attempt to compare nil with number

后面发现是需要预先写入缓存seckill:stock:11&#xff0c;其中11是优惠券id 我数据库里面是11 &#xff0c;这里redis里面也写了11之后就好使了

html+css+JavaScript 实现两个输入框的反转动画

开发时遇到了一个输入框交换的动画 做完之后觉得页面上加些许过渡或动画&#xff0c;其变化虽小&#xff0c;却能极大的提升页面质感&#xff0c;给人一种顺畅、丝滑的视觉体验。它的实现过程主要是通过css中的transition和animation来实现的。平时在开发的时候增加一些动画效…

python安装PyTorch+cuda

1,最终结果 import torchprint(torch.cuda.is_available()) #显示True&#xff0c;则安装成功 print(torch.__version__)#打印当前PyTorch版本号。 print(torch.version.cuda)#打印当前CUDA版本号。 print(torch.backends.cudnn.version())# 打印当前cuDNN版本号。 print(torc…

vuepress创建步骤

背景 记录vuepress配置步骤&#xff0c;以便下次使用快速上手。 读此文章之前默认您已经学会了创建vuepress项目。vuepres快速开始 最终成品 doc.jeecgflow.com 配置步骤 创建.vuepress 目录。 你的文档目录下创建一个 .vuepress 目录。 创建.vuepress/config.js module.e…

【Whisper】WhisperX: Time-Accurate Speech Transcription of Long-Form Audio

Abstract Whisper 的跨语言语音识别取得了很好的结果&#xff0c;但是对应的时间戳往往不准确&#xff0c;而且单词级别的时间戳也不能做到开箱即用(out-of-the-box). 此外&#xff0c;他们在处理长音频时通过缓冲转录

法国工程师IMT联盟 密码学及其应用 2022年期末考试

1 密码学 1.1 问题1 对称加密&#xff08;密钥加密) 1.1.1 问题 对称密钥la cryptographie symtrique和公开密钥有哪些优缺点&#xff1f; 1.1.1.1 对称加密&#xff08;密钥加密)的优缺点 1.1.1.1.1 优点 加解密速度快encrypt and decrypt&#xff1a;对称加密算法通常基于…

四川蔚澜时代电子商务有限公司持续领跑抖音电商

在当今这个数字化飞速发展的时代&#xff0c;电子商务已成为推动经济增长的重要引擎。而在众多电商平台中&#xff0c;抖音电商以其独特的社交属性和年轻化的用户群体&#xff0c;逐渐崭露头角。四川蔚澜时代电子商务有限公司正是这股潮流中的佼佼者&#xff0c;他们专注于抖音…

【matlab 路径规划】基于改进遗传粒子群算法的药店配送路径优化

一 背景介绍 本文分享的是一个基于订单合并的订单分配和路径规划联合优化&#xff0c;主要背景是骑手根据客户需求&#xff0c;从药店取药之后进行配送&#xff0c;配送的过程中考虑路径的长度、客户的服务时间窗、车辆的固定成本等要素&#xff0c;经过建模和优化得到最优的配…

Qt 网络编程实战

一.获取主机的网络信息 需要添加network模块 QT core gui network主要涉及的类分析 QHostInfo类 QHostInfo::localHostName() 获取本地的主机名QHostInfo::fromName(const QString &) 获取指定主机的主机信息 addresses接口 QNetworkInterface类 QNetworkInterfac…

小试牛刀-区块链代币锁仓(Web页面)

Welcome to Code Blocks blog 本篇文章主要介绍了 [区跨链代币锁仓(Web页面)] ❤博主广交技术好友&#xff0c;喜欢我的文章的可以关注一下❤ 目录 1.编写目的 2.开发环境 3.实现功能 4.代码实现 4.1 必要文件 4.1.1 ABI Json文件(LockerContractABI.json) 4.2 代码详解…

挑战杯 LSTM的预测算法 - 股票预测 天气预测 房价预测

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

7月8号直播预告 | 全国产EtherCAT运动控制器ZMC432HG及其EtherCAT驱动器与控制器常用回零模式介绍

EtherCAT运动控制边缘控制器是工业互联网的关键组件之一&#xff0c;结合丰富的运动控制功能、实时数据采集、处理和本地计算等&#xff0c;具备高度灵活的可编程性和出色的运动控制性能&#xff0c;为运动控制协同工业互联网应用带来巨大市场潜力&#xff0c;同时也使其成为企…

简单实现联系表单Contact Form自动发送邮件

如何实现简单Contact Form自动邮件功能&#xff1f;怎样简单设置&#xff1f; 联系表单不仅是访客与网站所有者沟通的桥梁&#xff0c;还可以收集潜在客户的信息&#xff0c;从而推动业务的发展。AokSend将介绍如何简单实现一个联系表单&#xff0c;自动发送邮件的过程&#x…

VPN 的入门介绍

VPN&#xff08;虚拟专用网络&#xff09; 简介 虚拟专用网络&#xff0c;简称虚拟专网&#xff08;VPN&#xff09;&#xff0c;其主要功能是在公用网络上建立专用网络&#xff0c;进行加密通讯。在企业网络中有广泛应用。VPN网关通过对数据包的加密和数据包目标地址的转换实…

【Linux开发实战指南】基于UDP协议的即时聊天室:快速构建登陆、聊天与退出功能

author: bbxwg system_version: Ubuntu 22.04 Time : 2024-07-04 目录 技术简单讲解&#xff1a; UDP (User Datagram Protocol) 链表 父子进程 信号 基于UDP的即时聊天室系统&#xff1a;客户端与服务器端实现 客户端操作步骤 服务器端操作步骤 系统版本&#xff…

PIP换源的全面指南

##概述 在Python的世界里&#xff0c;pip是不可或缺的包管理工具&#xff0c;它帮助开发者安装和管理Python软件包。然而&#xff0c;由于网络条件或服务器位置等因素&#xff0c;直接使用默认的pip源有时会遇到下载速度慢或者连接不稳定的问题。这时&#xff0c;更换pip源到一…

用Conda配置 Stable Diffusion WebUI 1.9.4

用Conda配置 Stable Diffusion WebUI 1.9.4 本文主要讲解: 如何用Conda搭建Stable Diffusion WebUI 1.9.4环境,用Conda的方式安装,不需要单独去安装Cuda了。 1. 安装miniconda https://docs.anaconda.com/free/miniconda/index.html 2. 搭建虚拟环境 激活python虚拟环境…

PFC电路中MOS管的选取2

上面这种驱动方式叫推挽驱动&#xff0c;或者图腾柱驱动 当芯片驱动脚 DRV为高电平时&#xff0c;此时回路中的源是芯片的 DRV引脚&#xff0c;芯片驱动电流从左往右流动&#xff0c;通过 R1&#xff0c;通过Q1的be脚&#xff0c;通过R3、R4给MOS管Q4的Cgs结电容充电 不过值得…

AI工具,如何通过 GPT-4o 提高工作效率

文章目录 引言一、理解GPT-4o及其功能二、如何利用GPT-4o提高工作效率1. 代码生成与优化2. 自动化测试与调试3. 技术文档撰写与知识管理 三、实际案例与成功应用1. GitHub 协作与问题解决2. 敏捷开发与迭代优化 四、GPT-4o的挑战与应对策略五、未来展望与发展方向六、结论 &…