Leetcode打卡日记(2020.3.6~2020.3.10)

2020.3.6 和为s的连续整数序列(57-Ⅱ)

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
思路,双指针滑动,因为这是一个有规律的递增序列。
维护一个L指针指向序列的最左下标,维护一个R指针指向序列的最右下标。
注意函数的返回值为int[][] 这可以用List<int []>res;return res.toArray(new int[res.size()][])

2020.3.7 队列的最大值(59-Ⅱ)

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1。
push_back和pop_front函数时间复杂度实现为O(1)不难,关键是max_value。
因为队列不是双端的,所以有一个重要特性,当一个元素进入队列的时候,它前面所有比它小的元素就不会对max_value的返回值产生影响。为了实现max_value可以维护一个辅助队列,插入元素时,可以提前取出辅助队列中所有比这个元素小的元素,使得辅助队列中只保留对结果有影响的数字。
另外一个点是push_back()加上如上的操作后,经过均摊,时间复杂度仍未O(1)。假设一个序列 5 4 3 2 1 6 入队,虽然当6入队时,会执行操作5次,但是前5个元素入队时执行0次;假设一个序列 1 2 3 4 5 6 入队,2-6入队时,每次都会执行1次操作,也是5次。要理解这个“均摊”的意思。

2020.3.8 零钱兑换(322)

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
动态规划,第一次超时是因为递推关系写成:
dp[i]=Min{dp[j]+1},遍历范围是0<j<i,较大,改成:
dp[i]=Min{coins[j]+dp[i-coins[j]},遍历范围是coins.length

2020.3.9 买卖股票的最佳时机(121)

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。
动态规划,min[i]表示第i天包括第i天前的最低价。

2020.3.10 二叉树的直径(543)

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
题意中的最大直径不一定包括根节点。以一个节点为最高点的直径的最大值,等于该节点左右子树的最大深度之和。所以遍历所有的节点,比较以节点为最高点的直径的最大值,就可找出直径的最大值。
实现方法可以用递归。

发布了11 篇原创文章 · 获赞 0 · 访问量 315

猜你喜欢

转载自blog.csdn.net/weixin_42379024/article/details/104775024