LeetCode 374, 128, 17

目录

  • 374. 猜数字大小
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 128. 最长连续序列
    • 题目链接
    • 标签
    • Set
      • 思路
      • 代码
    • Sort
      • 思路
      • 代码
  • 17. 电话号码的字母组合
    • 题目链接
    • 标签
    • 思路
    • 代码

374. 猜数字大小

题目链接

374. 猜数字大小

标签

二分查找 交互

思路

看到本题的标签 交互 感觉有些奇怪,交互 意味着需要调用题目给出的方法。我们写的 guessNumber() 是用来猜数字的,而给出的 guess() 则是裁判。

本题可以采用二分法的常规实现——求指定值的位置或其后继的位置,如果不懂二分法的后继前驱,可以看这篇文章:算法——二分法。

唯一不同于普通二分法的是:没有给出 数组nums 和目标值target,但是给出了 对猜想值大小的判断,即 guess()方法。实际上,二分法 在判断下一次查找是在左子区间还是右子区间时 使用的 if-else 就是 对猜想值大小的判断,例如:target <= nums[mid] 的含义是 目标值小于或等于区间中点,也就是 猜大了 或者 猜对了,即 guess() 返回 -1, 0

代码

public class Solution extends GuessGame {public int guessNumber(int n) {int left = 0, right = n;while (left < right) {int mid = left + (right - left >> 1); // mid是猜想的值if (guess(mid) <= 0) { // 如果guess的结果小于或等于0,即 猜大了 或 猜对了right = mid; // 让right变小,从而缩小猜想的值} else { // 如果guess的结果大于0,即 猜小了left = mid + 1; // 让left变大,从而增大猜想的值}}return left;}
}

128. 最长连续序列

题目链接

128. 最长连续序列

标签

并查集 数组 哈希表

Set

思路

最长连续序列不关心数字的顺序,也不关心数字出现的次数,所以可以对数字做 预处理,即将数字存储到 HashSet 中,这是因为 HashSet 中不存放重复元素,也就是说对数字做了 去重 操作。

将所有数字都放入到 HashSet 中后,就可以遍历整个 HashSet,然后从其中获取元素,并判断这个元素是否存在它的下一个元素、下下一个元素等,直到不存在为止。判断存在性时,需要记录连续元素的最大值,即 判断存在性之前 应该 先获取判断的是哪一个数是否存在,这个数就是连续元素的最大值;此外,还需要使用一个变量来记录连续的元素个数,当退出判断时这个变量就是本次连续元素的长度,将其与结果值中的较大值赋值给结果值。

本题解的精髓不在上面这些基本操作,而是在于 控制时间复杂度。如果真的像上面这样写,则时间复杂度为 O ( n 2 ) O(n^2) O(n2)。可以发现,对于 元素num 和 元素num - 1,上面的思路会将这两个元素都判断一遍,但num 为起始元素的连续元素的长度 一定比 以 num - 1 为起始元素的连续元素的长度 小 1 1 1。对于获取最大连续元素长度的要求,对 num 的判断 不是必需的。所以在 num - 1 存在时,跳过对 num 的判断,这就将 O ( n 2 ) O(n^2) O(n2) 的复杂度转化为 O ( n ) O(n) O(n) 的复杂度了。

代码

class Solution {public int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<>(); // 储存数字的集合// 先把所有数字都加入集合,即对数字去重for (int num : nums) {set.add(num);}int res = 0; // 储存结果for (int num : set) {if (set.contains(num - 1)) { // 如果集合中存在当前数的上一个数continue; // 则跳过本次循环,这是O(n)的关键}int currNum = num; // 连续数字的最大数int currLen = 1; // 连续数字的长度while (set.contains(++currNum)) { // 直到不存在连续的数为止currLen++; // 增加连续数字的长度}res = Math.max(res, currLen); // 取更大的连续数字长度作为结果值}return res;}
}

Sort

思路

HashSet 的操作,例如 add(), contains() 都是外部API调用,在力扣的判题系统中很浪费时间,而上面这种解法需要使用很多次这样的操作,所以需要少调用一些外部API。

本题的核心在于 顺序+去重HashSet 用自身的不重复性满足了 去重,使用 contains() 满足了 顺序;除此之外,还可以使用 排序 满足 顺序,通过 只有相邻元素之差等于 1 时才让长度加一 的操作来满足 去重

代码

class Solution {public int longestConsecutive(int[] nums) {int n = nums.length; // 存储数组长度if (n < 2) { // 如果数组长度比2小return n; // 则直接返回它的长度,不需要判断}Arrays.sort(nums); // 对数组进行排序int res = 0; // 存储结果// 从第二个元素开始判断,默认第一个元素是为连续元素中的第一个元素int curr = 1; // 存储 连续元素的最大值的索引while (curr < n) { // 直到遍历完整个nums才退出循环int currLen = 1; // 存储当前连续元素的长度// curr在nums内 并且 相邻元素之差小于等于1 才进行循环while (curr < n && nums[curr] - nums[curr - 1] <= 1) {if (nums[curr] != nums[curr - 1]) { // 如果相邻元素不相等,即差为1currLen++; // 则当前连续元素的个数+1}curr++; // 判断下一个元素是否连续}res = Math.max(res, currLen); // 更新结果值curr++; // 从下一个元素开始判断,默认当前元素是连续元素中的第一个元素}return res;}
}

17. 电话号码的字母组合

题目链接

17. 电话号码的字母组合

标签

哈希表 字符串 回溯

思路

组合 就是 将多个选择的结果聚合到一起。在本题中,字符 2-9 都对应着不同的多个字符,本题的组合就是 对于 digits 中的每个数字,从其对应的字符中选取一个字符,最终拼接而成的字符串。

本题可以使用 深度优先搜索 的思想:在 digits 上进行搜索,每次搜索都将当前数字对应的所有字符都选取一遍。每次选择完毕一个字符,就搜索下一个数字所对应的字符,直到将整个 dights 搜索完,此时将拼接的字符串加入结果集合。

代码

class Solution {public List<String> letterCombinations(String digits) {if (digits.isEmpty()) { // 如果字符串为空return res; // 则返回空集合}dfs(digits.toCharArray(), 0);return res;}private List<String> res = new ArrayList<>(); // 储存结果的集合private StringBuilder builder = new StringBuilder(); // 存储拼接的字符串/*** 对digits进行深度优先搜索* @param digits 待搜索数组* @param curr 当前元素的索引*/private void dfs(char[] digits, int curr) {if (curr == digits.length) { // 如果遍历完了整个数组res.add(builder.toString()); // 则将拼接的字符串放入结果集合return; // 然后返回}for (char ch : mapper[digits[curr] - '2']) { // 取出当前元素映射的所有字符builder.append(ch); // 先将字符拼接到字符串dfs(digits, curr + 1); // 然后进行下一个元素的遍历builder.deleteCharAt(builder.length() - 1); // 最后将这个字符从字符串中删去}}private char[][] mapper = new char[][]{{'a', 'b', 'c'},{'d', 'e', 'f'},{'g', 'h', 'i'},{'j', 'k', 'l'},{'m', 'n', 'o'},{'p', 'q', 'r', 's'},{'t', 'u', 'v'},{'w', 'x', 'y', 'z'}}; // 数字2-9与字符的映射
}

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

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

相关文章

一个使用Go语言和现代Web技术构建跨平台桌面应用程序开源项目

大家好&#xff0c;今天给大家分享一个使用Go语言和现代Web技术构建跨平台桌面应用程序开源项目Wails。 Wails是一个允许开发者使用Go和Web技术编写桌面应用程序的项目。 它被设计为Go的快速且轻量的Electron替代品&#xff0c;旨在提供一个平台&#xff0c;让开发者可以利用Go…

unity使用 MQTT复现plant simulate仿真

unity使用 MQTT复现plant simulate仿真 一、plant simulate端配置 1、plant simulate MQTT组件配置&#xff0c;该组件在类库的信息流类目下&#xff0c;端口不变&#xff0c;填写ip即可&#xff1b; 2、设备配置界面&#xff0c;在控件入口和出口处各挂一个脚本&#xff0c;…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

面向对象机考指南

目录 Eclipse使用 调字体大小 Ptg to JavaBean 解决控制台消失问题 第三题大题 控制台 Eclipse使用 调字体大小 Window —> Preferences 搜索font 点击Color and Fonts 找到Java 展示字体 这个这个 即可调节字体大小 Ptg to JavaBean 生成 空参构造 带参构造 gett…

C++基础(一)

目录 1.不同版本的hello word&#xff01; 2.namespace和&#xff1a;&#xff1a;域作用限定符以及using 2.1 namespace 2.2&#xff1a;&#xff1a; 2.3using用于展开域 3.C输入和输出 4.缺省参数 5.重载 6.引用 6.1引用介绍 6.2 引用的特性 注意&#xff1a; 6.4 c…

win11用户由中文名改为英文名

目录 前情提要 一喜一悲&#xff1a;找回“消失”的文件&#xff0c;却失去新建文件的权限。 找回“消失”的文件 ​编辑 失去新建文件的权限 核心问题&#xff1a;怎么解决右键只建立文件夹&#xff1f; 弯路1&#xff1a;获取管理员权限 弯路2&#xff1a;获取管理员权…

Linux基础(权限)+mysql(函数)+初始shell

[rootcentos ~]# whereis test.c test: /usr/bin/test /usr/share/man/man1/test.1.gz /usr/share/man/man1p/test.1p.gz [rootcentos home]# zip -r my.zip lesson1 将目录设为zip unzip my.zip -d xxxxxx 可指定要减压到的位置。 tar [-cxtzjvf] 文件与目录 .... 参数&…

python自动化之用flask库写一个登陆接口(代码示例)

用到的库&#xff1a; 1、flask&#xff08;写接口&#xff09; 2、cerberus&#xff08;校验数据&#xff09; 实现效果&#xff1a;输入账号和密码&#xff0c;校验数据类型是否是字符串&#xff0c;如果是&#xff0c;返回登陆成功&#xff1b;如果不是&#xff0c;返回数…

UnityHub 无法添加模块问题

文章目录 1.问题描述2.问题解决 1.问题描述 在Hub中无法添加模块 2.问题解决 1、点击设置 2、设置版本安装位置 可以发现installs的安装位置路径设置不是unity安装位置&#xff0c;这里我们更改成自己电脑unity安装位置的上一级路径 添加模块正常&#xff1a;

【C++】哈希表的模拟实现及 unordered_set 和 unorderded_map 的封装

目录 前言一、哈希表的模拟实现1.1 哈希表的改造1.1.1 模板参数列表的改造1.1.2 增加迭代器操作 1.2 哈希表的模拟实现1.2.1 哈希表中仿函数的实现1.2.2 哈希表中节点类的实现1.2.3 哈希表中迭代器类的实现1.2.4 哈希表中构造函数、析构函数和 Clear() 函数的实现1.2.5 哈希表中…

阐述 C 语言中的浮点数精度问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&…

matlab支持向量机使用错误

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

ROS的TF系统

一、SLAM 1、SLAM全称是Simultaneous Localization And Mapping&#xff0c;即同时定位与地图构建 2、SLAM软件包Hector_Mapping&#xff0c;←建图可参考链接所示文章 二、机器人定位 1、假设机器人开始建图的位置是地图坐标系的原点 2、则机器人在建图过程中的位置可以描…

DenseNet算法实现乳腺癌识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、前期准备 1.设置GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import …

CUDA原子操作

代码 #include <cuda_runtime.h> #include <stdio.h>__global__ void atomicAddAndGet(int *result, int *valueToAdd) {// 原子加法int addedValue atomicAdd(result, *valueToAdd);// 通过原子操作后读取值&#xff0c;确保是加法后的值addedValue *valueToAd…

黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录 Day4

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会…

HDFS Decommission节点的长尾分析和问题解决

文章目录 前言Decommission过慢的分析过程NameNode页面并不显示Decommission的进度和剩余块数量增加每次调度的块数量增加Stream Limit以避免节点被Skip节点被Skip时应该在DEBUG时打印原因在大量节点被Skip的时候加快有效调度其他可能改进 基本流程解析用户通过节点刷新触发Dec…

java Web学习笔记(一)

文章目录 1. 前置学习知识2. Tomcat介绍Tomcat目录文件介绍URL的组成部分和项目资源的对应关系idea配置部署tomcat并成功运行一个app-web项目 3. HTTP协议介绍&#xff08;很重要&#xff09;HTTP协议和HTTPS的区别HTTP协议的发展理解HTTP协议 报文格式报文响应的状态码 4. Ser…

以设备为核心的状态自动采集、人工运维和预测性维护为一体的智能管理系统

中服云设备全生命周期管理系统充分利用物联网、人工智能、机器学习、大数据等新一代技术&#xff0c;实现对企业生产设备从采购、安装、调试、使用、维护、维修、改造、更新直到报废全生命周期的智能化、数字化、可视化的实时管控&#xff0c;支持设备运行状态的自动采集和人工…

js 中 new Worker 报错 Failed to construct ‘Worker‘

new Worker("worker.js");运行多线程 Web Worker 的时候报错 Uncaught DOMException: Failed to construct ‘Worker’ 原因是浏览器不允许通过本地文件访问使用Web Worker。 解决方法&#xff1a; 将项目部署到服务器上或者用Node起本地服务访问项目