Leetcode: 121-130解题笔记

121. 买卖股票的最佳时机

给一个数组,其中第i个元素是一只股票在第i天的价格,然后 只允许买卖一次 ,要求获得最大利润。解题时找一个数组minPrice来更新第i天之前出现过的股票的最小价格,然后使用找到最大的prices[i]-minPrice[i]就可以了。

122. 买卖股票的最佳时机II

题目同上,但是 可以多次买卖 ,那就是一个贪心思想:只要第二天的价格比前一天要高,我就前一天买入第二天卖出,这样保证整个数组中的利润我都能赚到。

123. 买卖股票的最佳时机III

难题暂时搁置

124. 二叉树中的最大路径和

难题暂时搁置

125. 验证回文串

给定一个字符串,验证它是否是回文串。注意字符串中可能会出现各种的字符,但是我们只考虑其中的字母,并且所有的字母都视为小写。

使用数组下标从尾到头遍历即可。可以使用isalpha方法来判断是否属于字母,用isupper/islower方法来判断大小写情况。

126&127. 单词接龙I & II

给定两个单词作为起始字符串S与结束字符串E,以及给定的字符串向量wordList,要判断是否存在一条从S到E的转换路径,其中除了S以外的所有中间单词都要在wordList中,并且每次转换时 只能更换单词中的一个字符 。对于126题,要求给出所有符合条件的路径;对于127题,只要求给出最短的路径长度。

这道题稍微有点意思,但是解题思路仍然比较简单: 使用广搜 就可以了。要注意广搜时候对中间状态的存储,以及已经遍历过的字符不要再搜索了,因为重新遍历到这个字符肯定不会对找到最短路径有所帮助。

另外在实际测试的时候,从S搜索E的时间常数稍微有点高(虽然也能通过测试),可以考虑使用 双向广搜 ,然后设置两个map来分别存储前向和后向搜索时从S/E出发到达每个单词的最短路径,以避免重复搜索单词的情况出现。当两个map中出现重复的单词时,只需要两个map中这两个单词的最短路径相加,就是最短转换序列的长度了。

128. 最长连续序列

给定一个没有排过序的数组,找出其中最长的连续序列的长度。比如$[100,4,200,1,3,2]$,最长连续序列就是$[1,2,3,4]$,长度就是4。反正就是看里面某一个最长连续的序列有多长。解决思路如下:

  1. 扫描一遍数组,把数字映射到哈希字典中,使能在 常数时间判断某个数字是否存在于原数组中 ,并且判断 当前数字是否已经被扫描过
  2. 重新扫描一遍数组,对于每个数字n,使用哈希表判断n-1以及n+1是否存在于数组中,总之向两边扩展直到无法扩展为止。在扩展过程中扫描到的在数组中的数字,我们要置它的 已扫描标志位 为1,这是为了避免在往后扫的过程中,同一个连续序列被多次扫描(因为要求时间复杂度是O(n)嘛!)。
  3. 在扫描每个数字后,更新最长序列的长度即可。

129. 求根到叶子节点的数字之和

要求所有从树根到叶子节点的路径之和,注意 父子节点之间的数值差为十倍 比如说树$[1,2,3]$,实际的和应该是$(1\times10+2)+(1\times10+3)=25$ 。

解题的思路倒是很普通,使用一个递归求和就可以了。这道题我因为粗心,在叶子节点累加和之后 没有直接return ,导致在大数的时候溢出了,总之是很蠢的错误,写出来以为警告。

130. 被围绕的区域

一个二维向量元素由’X’与’O’构成,要把所有被’X’包含的’O’都改成’X’,在边界的’O’不算做被包围。

这道题其实是一个基础的广搜,但是测试用例中有一个特别大的向量,导致我的一个空间复杂度为O(n)的实现思路内存爆了。当然我的思考中是对所有中间的’O’进行广搜,网上所发表的可行思路是 对所有边界上的O进行广搜 ,然后做标记。然后再遍历一遍整个二维向量,把没有做标记的’O’给更新成’X’就可以了。