23_7第一周LeetCode刷题回顾

news2024/11/13 14:41:32

目录

    • 1. 两数之和
    • 2. 两数相加
    • 3.无重复字符的最长子串
    • 4.寻找两个正序数组的中位数
    • 5.最长回文子串
    • 6.N 形变换
    • 7.整数反转
    • 8.字符串转整数(atoi)
    • 9.回文数
    • 10. 正则表达式匹配
    • 11. 盛最多水的容器
    • 12. 整数转罗马数字
    • 13. 罗马数字转整数
    • 14. 最长公共前缀
    • 15.三数之和
    • 16.最接近的三数之和
    • 17.电话号码的字母组合
    • 总结
    • 声明

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

数组中存在两个数 x x x y y y ,使得 x + y = t a r g e t x+y=target x+y=target

可以直接枚举数组中的所有可能的两数组合可能,找到答案。

for(int i = 0; i < nums.size(); ++i){
	for(int j = i + 1; j < nums.size(); ++j){
		if (nums[i] + nums[j] == target) break;
	}
}

时间复杂度: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( 1 ) O(1) O(1)

双指针

题目核心为查找, 对于查找,我们一般会先对数组排序。这样我们就可使用二分查找,也能进行更多有规律的操作。

(1)将数组nums[i]升序排序

(2)取指针l,r 分别指向nums的首、尾,即l = 0, r = nums.size() - 1

(3)如果nums[l] + nums[r] == target ,则返回结果。如果nums[l] + nums[r] > target ,说明则让 r--。否则, l++

(4)直至找到答案或l >= r。

如果nums[l] + nums[r] > target, 说明两数和大于目标值。所以需要将两数和减少,这样才可能找到答案。由于我们数组已经升序排好了,所以让右边的r左移一位,使得nums[r] 变小,变为nums[r-1]。如果两数和小于目标值,则需要将nums[l]变成nums[l+1],实现两数和增大。

然后继续比较,逐渐逼近答案。

sort(vec.begin(), vec.end());
while(l < r){
    int temp = vec[l] + vec[r];
    if(temp == target) break;
    else if(temp > target) r--;
    else l++;
}

时间复杂度: O ( n log ⁡ 2 n ) O(n\log_2n) O(nlog2n)

空间复杂度: O ( n ) O(n) O(n)

哈希表

对于 n u m [ i ] num[i] num[i],需要找到个nums[j], 使得 n u m s [ j ] + n u m s [ i ] = t a r g e t nums[j] + nums[i] = target nums[j]+nums[i]=target ,即数组中取一个数 nums[i] 需要查找 target - nums[i] 。

借助哈希表,实现查找复杂度为 O ( 1 ) O(1) O(1)

unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i) {
    auto it = hashtable.find(target - nums[i]);
    if (it != hashtable.end()) {
        return {it->second, i};
    }
    hashtable[nums[i]] = i;
}

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

链表结点存放数字,取出相加即可。需要注意进位以及当两链表长度不同时,带来的其中一链表可能提前遍历到尾部,使指针为空。

解决也很简单

(1)创建一个变量carry,用来存放进位值。

(2)当一链表遍历结束时,另一链表未结束,此时循环还在继续。将遍历结束的链表的结点值设为0即可。

int x = l1 ? l1->val : 0;  // l1 和 l2 是两个真在遍历的链表
int y = l2 ? l2->val : 0;

还有就是可能最高位运算也会产生进位,此时需要新建一个结点存值

3.无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

思路也不难。区间内不含重复字符。

首先,需要两个指针l, r 来指代正在遍历的区间。然后让r++,来拓展区间。如果 s[r+1] 在区间内已存在,说明一找出一个不重复子串,记录长度。接着需要将l++ 来减小区间,含重复的字符的区间缩小到不含重复字符。

在这里插入图片描述

判断区间内是否含重复字符,借助哈希集合可以快速判断。

4.寻找两个正序数组的中位数

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n))

简单点,直接合并两数组,然后在找中位数。

其他方法,不会。

5.最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

选定区间左边界 i ,依次缩小右边界 j,知道 [i, j] 是回文串。这样找到 s[i] 为开始的最长回文子串。

依次找到所有位置开始的最长子串,选最长,即为答案。

优化

可以进行简单的优化。比如已求的最优长子串为长度为 ans,输入串 s 的长度为 n。

(1)如果 n - i < ans ,那循环结束。说明以 i 开始的最长的子串都长度都小于ans,那么以i开始的最长回文串也一定会小于ans,所以没必要在求最优子串。

(2)同样,如果 [i, j] 区间的长度小于 ans,也没必要在继续减小 j 求以 i 开始的最优回文串了 。

6.N 形变换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

直接遍历。大循环套俩小循环。先竖着遍历存储(PAY),然后遍历存储(P)。接着继续竖直存储,斜着遍历。

设置好存储结构,加点简单判断。搞清楚结束条件。

7.整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

x % 10 : 取x的最低位数值。

x /= 10 : 去除x的最低位,相当于10进制的x右移一位。

遍历过程中,别溢出就行。

8.字符串转整数(atoi)

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

多写几个判断就行。注意,要提前判断整数是否溢出,溢出返回0。

判断方式: res > (INT_MAX - digit) / 10

9.回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

转换成字符串,判断是否是回文串就行。

10. 正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.''*' 的正则表达式匹配。

  • '.' 匹配任意单个字符
  • '*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

没写出来。

看了题解,理清思路,不停判断。懒得看。

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:**你不能倾斜容器。

img

感觉有点像第1题的那个寻找两数之和的左右指针的方式。

选定区间[l, r], 那么盛水量为 ans = max( ans, min(height[l], height[r]) * (r - l) )

此后,区间长度(r-l)不停缩小,如果想让ans变大,只可能将 min(height[l], height[r]) 变大,所以只需要将height[i] 和 height[j]小的一边移动,大的另一边不动。这样min(height[l], height[r]) * (r - l) 的 min(height[l], height[r]) 变大, (r - l) 变小,二者的乘积才有可能增大,即盛水量增大。

int i = 0, j = height.size() - 1, res = 0;
while(i < j) {
    res = height[i] < height[j] ? 
        max(res, (j - i) * height[i++]): 
    max(res, (j - i) * height[j--]); 
}

12. 整数转罗马数字

罗马数字包含以下七种字符: IVXLCDM

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

搞清楚规则,然后写个循环模拟判断选择即可。

如果大于M,先减M。否则如果大于IM,减IM。否则如果小于D,减D。。。不停判断下去就行。

13. 罗马数字转整数

罗马数字包含以下七种字符: IVXLCDM

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II27 写做 XXVII, 即为 XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。

找出规律,再写。

对于特殊的IV, IX,IC 都满足类似以下的规律:

IV: I V = − I + V = − 1 + 5 = 4 = I V IV=-I+V = -1 + 5 = 4 = IV IV=I+V=1+5=4=IV

所以如果ans = s[i] < s[i+1] ? ans - getValue(s[i]) : ans + getValue(s[i])。 其中, i < s.length()-1,防止i+1访问越界。

14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

纵向比对,即可。

15.三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

在第一题的两数之和基础上略作改变皆可。nums[i] + nums[j] = -nums[k]。

16.最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

类比上一题的三数之和。

17.电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

建立一个从数字到字母的映射表,然后进行简单回溯即可。

总结

这17期道题目,还是比较基础的。主要考察的还是一些简单的思路分析,使用双指针,滑动窗口和特殊的数据结构,比如哈希表和哈希集合。没有特别难的算法和数据结构。但收获还是很多的。

声明

题目全部来自LeetCode官网,部分题解参考了官方题解。

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

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

相关文章

MyBatis中的动态SQL(sql标签、where标签、set标签、批量增加与批量删除)

目录 sql标签 ​编辑 where标签 set标签 foreach标签 批量增加 批量删除 将基础SQL语句中重复性高的增加它的复用性&#xff0c;使得sql语句的灵活性更强 sql标签<sql> <sql id"text">select * from user</sql><select id"selectA…

如何在苹果商店发布App?

一、介绍 众所周知&#xff0c;苹果对于自家产品的安全问题十分重视&#xff0c;他们有严格的一套审核标准和流程&#xff0c;当我们想要在苹果商店发布一款App的时候就需要经过重重艰难险阻&#xff0c;克服不少繁杂的问题去完成这项工作。 另外有一点需要注意的是&#xff…

C语言库函数strcpy学习

strcpy是C语言的一个标准库函数&#xff1b; strcpy把含有\0结束符的字符串复制到另一个地址空间&#xff0c;返回值的类型为char*。 原型声明&#xff1a;char *strcpy(char* dest, const char *src); 头文件&#xff1a;#include <string.h> 和 #include <stdio.h&g…

领域驱动设计(三) - 快速开始 - 【3/3】事件风暴

使用DDD的最终目的是深入学习业务如何运作。然后基于学习试验、质疑、再学习和重建模的过程。过程中面临的最大挑战是如何快速学习&#xff0c;并且在保证学习质量的前提下压缩学习时间&#xff08;你的学习是需要公司付工资的&#xff09;。 事件风暴就是一种相对高效的分析工…

【电子学会】2023年05月图形化二级 -- 接水果

接水果 天上掉落各种水果下来&#xff0c;有草莓、苹果、香蕉&#xff0c;快拿大碗去接住水果吧。 1. 准备工作 &#xff08;1&#xff09;导入背景Blue Sky&#xff1b; &#xff08;2&#xff09;删除小猫角色&#xff0c;导入角色Bowl、Apple、Strawberry、Bananas。 2.…

【技能实训】DMS数据挖掘项目-Day03

文章目录 任务5【任务5.1】基础信息实体类【任务5.2.1】继承DataBase类&#xff0c;重构日志类【任务5.2.2】继承DataBase类&#xff0c;重构物流实体类【任务5.2.3】创建物流、日志测试类&#xff0c;测试任务5.2中的程序&#xff0c;演示物流信息、日志信息的采集及打印输出 …

【Redis】Transaction(事务)

&#x1f3af;前言 Redis事务是一个组有多个Redis命令的集合&#xff0c;这些命令可以作为一个原子操作来执行。 Redis事务通常用于以下两种情况&#xff1a; 保证操作的原子性&#xff1a;在多个命令的执行过程中&#xff0c;如果有一个命令执行失败&#xff0c;整个事务都需…

【数据编制架构】数据编织(Data fabric)架构完整指南

本文探讨了 Data Fabric 的内容、原因、方式和人员&#xff0c;包括 Data Fabric 架构、挑战、优势、核心功能、供应商等。 Data Fabric——以数据为中心的企业的“必备” 在过去几年中&#xff0c;“Data Fabric”一词已成为企业数据集成和管理的代名词。分析公司 Gartner 将“…

vtkButtonWidget Window 添加按钮

有时我们需要在 VTK 窗口中增加 按钮&#xff0c;右上角&#xff1b; 实现&#xff0c;通过回调函数&#xff0c;vtkButtonCallback 获取点击&#xff1a; #include <vtkVersion.h> #include <vtkSmartPointer.h>#include <vtkPolyDataMapper.h> #include &…

Java性能权威指南-总结27

Java性能权威指南-总结27 数据库性能的最佳实践Java集合类API同步还是非同步设定集合的大小 集合与内存使用效率 数据库性能的最佳实践 Java集合类API Java的集合类API有很大的选择余地&#xff1b;Java 7至少提供了58个不同的集合类。在编写应用时&#xff0c;选择恰当的集合…

数据结构算法题——数组

leetcode-1.两数之和 leetcode-1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在…

阿里云AliYun物联网平台使用-申请免费试用及完成初始配置

一、项目简介 本专栏文章将围绕阿里云物联网平台&#xff0c;实现其设备向云平台的数据上传&#xff0c;客户端获取云平台数据。设备通过NBIOT技术实现无线采集&#xff0c;定时上传。 二、阿里云平台申请 阿里云物联网平台试用申请地址 进入上述超链接网址&#xff1a; 由于是…

【InnoDB 存储引擎】15.7.1 InnoDB Locking(锁实验,包含了如 记录锁、间隙锁、Next-Key Lock 算法等,重要)

文章目录 1 关于 Record Lock 的实验1.1 实验 1&#xff1a;没有主键时的如何锁定1.2 实验 1&#xff08;续&#xff09;&#xff1a;带着问题继续实验1.3 实验 2&#xff1a;有主键时如何锁定 2 关于 Next-Key Lock 的实验2.1 实验 3&#xff1a;如何确定算法的锁定范围2.2 实…

VS 字体不对齐解决方案

1. 问题描述 输入相同数量但不是同一类型的字符的字符&#xff0c;会出现字符显示不对齐的问题。 在某些需要根据对齐来写的代码的时候&#xff0c;这种情况是相当的折磨。 2. 解决方案 设置等宽字体。 依次点击 VS 上方的 工具 → 选项 → 字体和颜色 → 字体 → 随便选择一款…

基于simulink识别彩色视频序列中的交通警告标志

一、前言 此示例演示如何识别彩色视频序列中的交通警告标志&#xff0c;如“停止”、“请勿进入”和“让行”。 二、模型 下图显示了交通警告标志识别模型&#xff1a; 三、交通警告标志模板 该示例使用两组模板 - 一组用于检测&#xff0c;另一组用于识别。 为了节省计算…

Linux常用命令——ex命令

在线Linux命令查询工具 ex 启动vim编辑器的ex编辑模式 补充说明 在ex模式下启动vim文本编辑器。ex执行效果如同vi -E&#xff0c;适用于法及参数可参照vi指令&#xff0c;如要从Ex模式回到普通模式&#xff0c;则在vim中输入:vi或:visual即可。 语法 ex&#xff08;参数&…

【算法设计与分析】集合相等问题——设计一个拉斯维加斯算法,对于给定的集合S和T,判定其是否相等。

目录 一、问题描述二、问题分析三、运行结果四、源代码 一、问题描述 给定两个集合S和T&#xff0c;试设计一个判定S和T是否相等的蒙特卡洛算法。 数据输入&#xff1a; 由文件input.txt给出输入数据。第1行有1个正整数n&#xff0c;表示集合的大小。接下来的2行&#xff0c;每…

路径规划算法:基于梯度优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于梯度优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于梯度优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法梯度…

关于线程池其他一些知识点的讨论

文章目录 前言一、线程池的几种任务队列1.ArrayBlockingQueue2.LinkedBlockingQueue3.DelayedWorkQueue4.SynchronousQueue 二、如何确定核心线程数&#xff1f;三、线程池的种类有哪些&#xff1f;1.newFixedThreadPool2.newSingleThreadExecutor3.newCacheThreadPool4.newSch…

AI掌绘艺术:揭秘Stable Diffusion华美图韵背后那些提示词的秘密

开篇 好了好了&#xff0c;我知道这个标题有点大&#xff0c;大得像我妈的锅一样。但是&#xff0c;我保证&#xff0c;当你读完这篇文章后&#xff0c;你不仅会明白我为什么敢用这样的标题&#xff0c;而且你也会想试试宝贵的AI画画方法。 首先&#xff0c;我要说&#xff0…