找出数组中的第一个回文字符串
1 | 给你一个字符串数组 words ,找出并返回数组中的 第一个回文字符串 。如果不存在满足要求的字符串,返回一个 空字符串 "" 。 |
1 | 输入:words = ["abc","car","ada","racecar","cool"] |
1 | 输入:words = ["notapalindrome","racecar"] |
1 | 输入:words = ["def","ghi"] |
这道没什么说的,依次遍历每一个字符串取反后进行比较,如果相等直接返回
1 | class Solution(object): |
向字符串添加空格
1 | 给你一个下标从 0 开始的字符串 s ,以及一个下标从 0 开始的整数数组 spaces。 |
1 | 输入:s = "LeetcodeHelpsMeLearn", spaces = [8,13,15] |
1 | 输入:s = "icodeinpython", spaces = [1,5,7,9] |
1 | 输入:s = "spacing", spaces = [0,1,2,3,4,5,6] |
这道题的思路是:根据要插入空格的地方将字符串进行拆分,将拆分后的字符串通过空格连接即可。这里要注意spaces
第一个位置和最后一个位置的处理。
1 | class Solution(object): |
股票平滑下跌阶段的数目
1 | 给你一个整数数组 prices ,表示一支股票的历史每日股价,其中 prices[i] 是这支股票第 i 天的价格。 |
1 | 输入:prices = [3,2,1,4] |
1 | 输入:prices = [8,6,7,7] |
1 | 输入:prices = [1] |
这道题思路也比较简单,首先我们考虑一下,对于连续1天,则可以得到平滑下降的阶段是1个,对于连续2天,则可以得到平滑下降的阶段是3个,假如prices=[2,1]
,则阶段值为[2],[1],[2,1]
,对于连续3天,则可以得到平滑下降的阶段是6个,假如prices=[3,2,1]
,则阶段值为[3],[2],[1],[3,2],[2,1],[3,2,1]
,这样我们就可以找到规律,对于连续n天,平滑下降的阶段是1+2+...+n
的值。
所以我们可以依次遍历prices
中的值,找到每一个连续平滑阶段,并根据每一个阶段中的值计算数目。
1 | class Solution(object): |
做最后这道题之前,我们先做一下Leetcode
第300题,最长递增子序列。
最长递增子序列
1 | 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 |
1 | 输入:nums = [10,9,2,5,3,7,101,18] |
1 | 输入:nums = [0,1,0,3,2,3] |
1 | 输入:nums = [7,7,7,7,7,7,7] |
这道题要找的是严格递增的子序列,我们首先来根据动态规划的思路走一遍。
如果nums
的长度是1,那么不用考虑,直接返回1即可。
- 从
nums
的长度大于等于2开始,首先我们要初始化一个dp数组
。这个数组的初值可以全部设置为1,因为最短的子序列长度也是1。 - 从第2个值开始遍历,依次比较当前值之前的所有值,从而更新当前值之前的最长子序列长度,更新到
dp[i]
中 - 设置一个全局的值,用来保存最长子序列的长度
1 | class Solution(object): |
另一种做法,通过bisect
模块实现
1 | class Solution(object): |
使数组 K 递增的最少操作次数
1 | 给你一个下标从 0 开始包含 n 个正整数的数组 arr ,和一个正整数 k 。 |
1 | 输入:arr = [5,4,3,2,1], k = 1 |
1 | 输入:arr = [4,1,5,2,6,2], k = 2 |
1 | 输入:arr = [4,1,5,2,6,2], k = 3 |
这道题和Leetcode
第300题有些类似,只不过这里面加了一个K递增的概念。而且要注意的是,这里面没有要求严格递增。所以这道题我们可以分三步走
- 首先将数组分为k组
- 对k组中的每个数组遍历,求解每个数组的最长子序列
- 这k组中的每个数组长度减去每个数组的最长子序列就可以得到每个数组需要修改的最少操作数
最终将k组中每个数组变为非递减需要的最少操作数相加即可
1 | class Solution(object): |
超时了。。。。😭
另外一种做法,没超时🐶,基本思路还是一样的。
1 | class Solution(object): |