力扣学习day2

学习目标:

1.在2021年2月底刷完力扣10%题目。 2.从零开始学习C,C++,python。 3.用多种方法写出解题思路,以及理解代码。

学习内容:

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

网址

题目:给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。

进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

思考:这道题如果单单只是做简单的很容易实现,就是先将两个链表进行合并,然后再找到中位数,这个是最基本的做法,现在突然有个想法,之后把一些基础的练习再独立的整理出来。

但是,这题在力扣网有着困难的难度,主要是因为进阶难度稍微有点大,我没写代码实现该题的进阶难度,只是大致思考了如何实现。

我的进阶算法思路就是不断的取两个数组的中间值进行对比,然后根据不同情况剔除一半,最后取到中间数。

但是这个想法的难点在于对所有情况的考虑,万一漏掉一种情况就有可能会出错,下面是不考虑数组长度影响下的情况,大致其实就是三种情况相离,交叉和重叠。然后根据先后顺序就有六种情况。然后因为中位数会根据数的奇偶性,又可以延伸出两种情况。总之因为是不断取中间数来舍去偏离中心的两端,因此最终绝对是可以获得正确结果的,其复杂度满足进阶需要,但对于程序员来说确实有点考虑多种情况有点“烧脑”,不过这些基本情况有些是不需要考虑,可以进行简化。

下面是我简单的列举几种情况的图像,单纯想试试UML图的功能,感觉这个用来描述TCP协议是真的好用。

nums1与nums2相离,且nums2大于nums1。如果考虑长度的话,若nums1/nums2长度大于nums2/nums1,则只需要考虑nums1/nums2就可以了。

0 2 4 nums1 nums2 0 2 4
0 2 4 nums1 nums2 0 2 4

交叉情况,分别舍去一半必不可能在中位数的数值,这个可以简单的考虑,而且这个感觉做不做长度判断都区别不大。

1 2 3 4 nums1 nums2 1 2 3 4
1 2 3 4 nums1 nums2 1 2 3 4

重叠情况感觉叙述不够精确,其实就是交叉情况的特殊化,一个数组包含于另一个数组中,这个就不单独列出,实际考虑情况可以和交叉情况一致。

本人纯属纸上谈兵,简单的想叙述下自己的思路,如果有错,请大家帮忙纠正。

5. 最长回文子串

网址

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

思考:这道题的难度竟然是中等,我突然觉得两数之和评分过低了。个人的思路是用动态规划来实现的,设f(i,j)表示坐标i到坐标j的字符串是否为回文串,如果是回文串则数值为true,否则为false,初始全部赋值为false。另外,我们只考虑i<j的情况,大于的情况完全不需要考虑。

运算过程:先执行f(i,i+1),f(i,i+2)两种情况,把适合作为回文串的寻找出来,接着再运算出其它f(i,j)。公式:假设f(i,j)=true,且s[i-1]=s[j+1],则f(i-1,j+1)=true,否则为false。不断的把表格填满完,统计出最长的长度的回文串。

示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。

首先,把f(i,i+1)依次计算出相应位置,这个判断相对简单判断s[i]是否等于s[i+1]即可。

在这里插入图片描述

然后,把f(i,i+2)也依次计算出相应位置,判断s[i]是否等于s[i+2]即可。

在这里插入图片描述

最后,根据前面的那个公式依次计算出相应位置的f(i,j),我们就可以得到最终结果的表,根据这个表,我们找出最长的长度,其实在计算过程中只要得到true值就可以更新下最长长度。

在这里插入图片描述

按照我这样的思路时间复杂度和空间复杂度都为O(n^2),估计还会有更好的方法吧。

6. Z 字形变换

网址

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

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

P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

思考:这道题一开始,我是真的没理解要干嘛,后面才理解意思。我的思路很简单就是自己计算出每行会出现下标多少的字符,这个相对来说很好计算,为了方便起见我用n表示numRows行数。

那么第一行的字符下标是0,0+(2n-2)1,0+(2n-2)2,…为了后面说明方便,我就简单的把(2n-2)用t表示。

第二行的字符下标是(1,2
n-3),(1+t,2n-3+t),(1+2t,2n-3+2t),…



第i行的字符下标(i-1,2n-1-i),(i-1+t,2n-1-i+t),…

总之,我这种方法有点投机取巧的嫌疑,通过寻找数学规律,然后一次输出,空间复杂度为0(n),时间复杂度其实就是便利了依次字符串,所以为O(n)。

7. 整数反转

网址
给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。

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

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

思考:终于出了一道不阴间的题目了,这道题应该是我大一时候做过的,就是简单通过除法和取余将一个整数的每一位取下来,再进行反转的操作,唯一不同的是,这个数值大小比较大,最后的时候还要进行判断是否超出范围。

8. 字符串转换整数 (atoi)

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

函数 myAtoi(string s) 的算法如下:

读入字符串并丢弃无用的前导空格
检查第一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
注意:

本题中的空白字符只包括空格字符 ’ ’ 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

思考:题目日渐正常化,使我有点不适应,感觉就是做编译原理的识别数字类型的判断,而且这个判断显然比编译原理大作业容易,只要按照题目的要求一个个读取就行,这种题就是普通的字符串处理题目,上一个题目是对整型的处理。

9. 回文数

网址

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

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

思考:这道题和7.整数反转有异曲同工之处,稍先可以明确的是负数一定不是回文数,所以做个最简单的判断,如果x<0,则返回false。另外,可以利用整数反转,如果是回文数,则整数反转之后,前后值是相等的。计算其空间复杂度为O(1),时间复杂度为O(logn)。

10. 正则表达式匹配

网址

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

‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

思考:这题说实话,和编译原理只是十分的相近,但可惜的是,当时我编译原理写这道题是用了内置的代码,自动实现正则式,如果单单从字符串题目来思考这题,我是这么想的字符规律p有多少个字符就表示有多个状态。

我想到的是状态表的转移(忘了术语,编译原理里面的知识),然后从字符串s开始进行状态匹配和状态转移。这道题还比较人性,只出了两种正则式,而且显然没有循环就是一个单向的状态表,如果是CSP认证,估计会出4-5个正则式,虽然我可能有思路,但动手感觉对我来说现在还有点强人所难了。

祈祷:明天开始投下简历以及希望自己写题速度能几何式的加快,毕竟自己现在只是思考以及认识题目,这都做不到加速,那真的没救了。算一算,昨天day1上写了4题,今天6题,明天计划就8题吧,哈哈哈哈哈哈哈哈哈><!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此人受打击,决定去力扣历练

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值