March 1st - March 7th

Average of Levels in Binary Tree

题目大意:
有一棵二叉树,返回二叉树每一层节点值的平均值的列表。

思路:
很自然的想到了二叉树的层序遍历。为了得到每一层节点值的平均值,要先得到节点个数和该层节点值的总和。当前层的节点个数就是一开始队列中节点的个数,内部再加一层循环,表示对当前层的遍历。

提示知识点:

  1. 数据结构队列定义 Queue LinkedList
  2. Queue 的基本操作: size() ,offer(),poll()
  3. 入队左子节点和右子节点时判空

代码链接:
637.average-of-levels-in-binary-tree.java

Short Encoding of Words

题目大意:
有一个字符串数组,数组每个字符串是个单词,将这些单词重编码为一个新的字符串。编码后,每个单词都是新字符串的子串且都以#结尾,求满足要求的新字符串的最短长度。

思路:
将单词用Set存储,遍历每个单词,从Set中移除单词的所有子串。
然后遍历Set,求出最短长度。

提示知识点:

  1. Set array转Set, remove()
  2. String的substring()。

代码链接:
820.short-encoding-of-words.java

Design HashMap

题目大意:
这是一道设计题,要求实现HashMap的功能

思路:
题目有限制,key和value均为[0,10^6]的整数,因此一开始就把数组大小设置为1000001,而不必去考虑HashMap的扩容等工程问题。
关于HashMap的底层原理倒是可以再详细去研究下。

提示知识点:
集合类封装

代码链接:
706.design-hash-map.java

March 8th - March 14th

Add One Row to Tree

题目大意:
有一棵二叉树,给出深度d和节点值v,在树中插入新的一层作为第d层,该层节点值都为v,之前的左节点为新节点的左节点,之前右节点为新节点的右节点。根节点为第1层,若在第一层加入一层,则原来的根节点变为左节点。

思路:
逐层下降,当d为2时,进行插入层操作,当d大于2时,递归遍历左右子树节点,d减1。

提示知识点:

  1. 树的递归
  2. 根节点为空,函数直接返回。

代码链接:
623.add-one-row-to-tree.java

Integer to Roman

题目大意:
将整数转为罗马数字

思路:

  1. 整数范围限制在[1,3999],因此用数组表示出千百十个位上相应的表示,然后依次取出整数各个数位的罗马数字表示,按千百十个从左到右拼接起来。
  2. 注意每一位上4和9的表示略有不同。不使用数组,可以用当前数字去循环减一个基数,每减一次就拼接一个罗马字符串,基数按照10,9,4,1递减。

提示知识点:
数学

代码链接:
12.integer-to-roman.java

Coin Change

题目大意:
给出硬币面值数组和指定金额,用尽可能少的硬币数量兑换指定金额。假设每种面值的硬币有无数多。

思路:
将硬币面值按从小到大排序。

  1. amounts[i]为外层循环, coins[j]为内层循环
    i>=coins[j]时的动态规划方程:
    amounts[i] = amounts[i]==-1 ? amounts[i-coins[j]]+1 : Math.min(amounts[i], amounts[i-coins[j]]+1);
  2. coins[i]为外层循环, arr[j]为内层循环
    arr[j] = Math.min(arr[j],arr[j-coins[i]] + 1);

提示知识点:
动态规划

代码链接:
322.coin-change.java

Check If a String Contains All Binary Codes of Size K

题目大意:
检查一个字符串是否包含所有长度为K的二进制编码。比如K=2, 00110 包含所有长度为2的二进制编码(00,01,10,11)。

思路:
换一种思路,不去管所有的二进制编码是什么样的,我们只知道长度为K的二进制编码有(2^K)种 。遍历字符串长度为K的子串,并添加到Set,添加成功记录个数,如果个数达到最大种数则包含所有。如果遍历完整个字符串仍然没达到(2^K),则不包含。

提示知识点:

  1. 位运算符 << 求(2^K)
  2. Set去重
  3. String的substring()

代码链接:
1461.check-if-a-string-contains-all-binary-codes-of-size-k.java

Swapping Nodes in a Linked List

题目大意:
交换链表正序第K个节点和逆序第K个节点的值

思路:
先遍历到正序第K个节点,然后记录头节点指针p1,第K个节点指针p2,继续同时移动p2和p1,当p2指向最后一个节点时,p1指向的就是逆序第K个节点。

提示知识点:

  1. 双指针。
  2. 链表遍历,异常情况考虑判断空指针。

代码链接:
1721.swapping-nodes-in-a-linked-list.java

March 15th - March 21st

Encode and Decode TinyURL

题目大意:
编码和解码URL,即可以对URL按照一定格式编码,也可以根据编码后的字符串得到原始URL。

思路:
使用HashMap存储编码和原始URL的映射关系。编码可由URL生成其唯一标识,一种解法是随机生成UUID,重复概率小。

提示知识点:

  1. HashMap
  2. UUID.randomUUID()
  3. String的substring() indexOf()

代码链接:
535.encode-and-decode-tiny-url.java

Best Time to Buy and Sell Stock with Transaction Fee

题目大意:
买卖股票使得收益最大,不能同时进行多个交易,先出售股票才能再购买。

思路:
为了从第i天过渡到第i+1天,要么出售股票,cash = max(cash, hold + prices[i] - fee),要么购买股票hold = max(hold, cash - prices[i])。最后,要返回cash。

提示知识点:
动态规划

代码链接:
714.best-time-to-buy-and-sell-stock-with-transaction-fee.java

Generate Random Point in a Circle

题目大意:
给出圆心坐标和圆半径,随机返回一个圆内点的坐标。

思路:
圆心(x0,y0),半径r,则圆内点坐标范围(x0±r, y0±r)。在圆内还需满足条件:到圆心距离小于等于r。

提示知识点:
数学。Math.random()生成范围为(0,1)的double数,那么要生成范围
(-r, r),则为(Math.random()*2 - 1) * r。

代码链接:
478.generate-random-point-in-a-circle.java

Wiggle Subsequence

题目大意:

思路:

提示知识点:

代码链接:
376.wiggle-subsequence.java

Keys and Rooms

题目大意:
每个房间有若干进入其他房间的钥匙,问能否从房间0开始,进入每个房间?

思路:
需要一个房间是否被访问的标记数组。从房间0开始深度遍历,循环获得房间1到房间i的钥匙,若房间i未被访问,则将其作为新的起点,继续深度遍历。
结束后遍历标记数组,若都为true,则表示能从房间0进入所有房间,反之不能。

提示知识点:
深度优先遍历。

代码链接:
841.keys-and-rooms.java

Design Underground System

题目大意:
设计一个地铁系统。这个系统支持的功能:追踪乘客(ID)进站/出站的时刻。计算两站之间所有乘客花费时间的平均值。

思路:
需要两个Map,一个Map记录乘客的进站时间,另一个Map记录出站到进站的信息(所有记录数和总时间)映射,也即是第二个Map是Map的Map。
如果输入为checkIn,则更新第一个Map。
如果输入为check Out,则读取第一个Map乘客的入站信息,更新第二个Map,将两站之间信息的记录数加一,时间加上此次乘坐耗费的时间。
如果输入为读取平均值,直接读取第二个Map,计算平均值。

提示知识点:

  1. HashMap put(),get()
  2. 类的封装

代码链接:
1396.design-underground-system.java

Reordered Power of 2

题目大意:
重排序一个整数的数位,得到的数能否是2的幂

思路:
我们将这个数和2的幂的分别转为字符数组,排序然后转为新的两个字符串。若两字符串相同则能,不相同则不能。
整数范围为(0,10^9),因此最多比较到2的30幂次即可。

提示知识点:

  1. 位运算
  2. 字符串和字符数组互转

代码链接:
869.reordered-power-of-2.java

March 22nd - March 28th

Vowel Spellchecker

题目大意:
元音字母拼写检查。在单词列表中查询一个单词,如果输入单词恰好和列表中相同,则直接返回;如果大小写不一致或/和元音字母被其他元音字母替换,也返回第一个匹配的原单词,规则是先匹配大小写不一致再匹配元音字母不一致的情况。

思路:
需要一个Set存储单词列表中的单词。两个Map,一个Map的Key为对原单词全小写转换后的字符串,另一个Map的Key是对原单词中元音字母进行去元音字母处理的新串。只当Key不存在时,put原串到Map中。
查询时则对查询串进行相应处理,先查询原始串,再小写化处理后查询,最后去元音化处理查询,一旦匹配查询终止,三轮查询结束无匹配返回空串。

提示知识点:
HashMap 的putIfAbsent()和containsKey()

代码链接:
966.vowel-spellchecker.java

3Sum With Multiplicity

题目大意:
数组中 i, j, k 满足 i < j < k且 arr[i] + arr[j] + arr[k] == target的组合个数。

思路:
3sum问题的变式,遵循3sum问题的双指针法,先对数组排序,小于target移动左指针,大于target移动右指针。

计算组合个数时,与arr[i]值相同但下标i不同的应视为不同情况,不能简单跳过。对于同一个i, j和k可分别统计相同元素的个数,然后计算组合数nm,特别地arr[j]==arr[k]时,计算组合数为n(n-1)/2。

提示知识点:

  1. 双指针。
  2. 考虑特殊测试用例。

代码链接:
923.3-sum-with-multiplicity.java

Advantage Shuffle

题目大意:
优势翻转,翻转数组A,使得最多的下标i满足A[i] > B[i]。

思路:
田忌赛马。
为了使得满足要求的下标最多,我们总是用数组A中最小的元素去与数组B中的最小的元素比较。
先复制两个数组,再对A和B进行排序。需要一个Map和一个链表,Map中存储B中数组值B与可与之对应的A中元素值的链表assigned(一个值可能在B中出现多次,重组时依次出队取出),另一个链表remaining存储无法用来获取优势的值,重组时,若Map中不存在键B[i],则出队remaining中一个元素放入重组的位置,逐一比较排序后两数组的元素,最后重组结果数组。

提示知识点:

  1. 贪心
  2. 队列基本操作

代码链接:
870.advantage-shuffle.java

Pacific Atlantic Water Flow

题目大意:
求大陆上水流既能流向太平洋又能流向大西洋的单元坐标。水流可沿四个方向,从高位置向低位置流动。太平洋在陆地左上边界,大西洋在右下边界。

思路:
逆向深度遍历。陆地左边界和上边界的点一定可以流入太平洋,同理右边界和下边界的点也一定可以流入大西洋。从这些点出发进行深度遍历,可以抵达的点也一定可以流入对应海洋。注意这个抵达与水流方向恰好相反,即如果新的位置比旧的位置高或相等,那么遍历能够抵达。维护两个二维数组,分别表示能否流向太平洋和大西洋。遍历完成后,同时遍历这两个数组得出题目所求的点坐标集合。

提示知识点:
深度优先遍历

代码链接:
417.pacific-atlantic-water-flow.java

Word Subsets

题目大意:

思路:

提示知识点:

代码链接:
916.word-subsets.java

Palindromic Substrings

题目大意:

思路:

提示知识点:

代码链接:
647.palindromic-substrings.java

Reconstruct Original Digits from English

题目大意:

思路:

提示知识点:

代码链接:
423.reconstruct-original-digits-from-english.java

March 29th - March 31st

Flip Binary Tree To Match Preorder Traversal

题目大意:

思路:

提示知识点:

代码链接:
971.flip-binary-tree-to-match-preorder-traversal.java

Russian Doll Envelopes

题目大意:

思路:

提示知识点:

代码链接:
354.russian-doll-envelopes.java

Stamping The Sequence

题目大意:

思路:

提示知识点:

代码链接:
936.stamping-the-sequence.java

【2021.3】 LeetCode每日一题复盘相关推荐

  1. 【2021-4】LeetCode每日一题复盘

    四月终于得到全勤徽章了,第一枚徽章-- 坚持就是胜利 Week 1: April 1st - April 7th Palindrome Linked List 题目大意: 判断一个链表是否是回文链表 ...

  2. LeetCode每日一题之排列硬币

    前言: 大家好,今天是LeetCode每日一题的第十天,,给大家分享的是排列硬币,难度系数两颗星!废话不多说,先上题目! 1.1 题目要求 题目类型:排列硬币 题目内容: 总共有n枚硬币,将它们摆成一 ...

  3. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  4. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  5. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  6. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

  7. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

  8. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  9. leetcode每日一题·救生艇问题(Python)

    leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...

最新文章

  1. Oracle For Linux安装脚本
  2. vrish 删除虚机_使用Kvm命令集管理虚拟机
  3. Java中的classpath
  4. 图论--一般图带花树匹配--模板
  5. Java——n个数的全排列
  6. cat命令详解_好程序员Python培训之详解eval好与坏
  7. Javaweb经典三层架构的演变
  8. 三维数据平滑处理_关于CAD三维对象建模
  9. chromium 一些设置 --插件安装
  10. Flutter之EdgeInsetsGeometry简析
  11. 在WebClient类中保持Session
  12. python利用pyhive 连接hive
  13. echarts柱状图实现重叠
  14. Procdump+Mimikatz获取Windows明文密码
  15. Android:给图片加边框
  16. 小米路由修改服务器密码,192.168.31.1小米路由器修改WIFI密码
  17. Java获取今天 开始和结束时间
  18. 将Jetson XavierNX的Ubuntu系统迁移至到nvme固态硬盘上
  19. 使用负载均衡技术建设高负载的网络站点(经典文章)
  20. 基于实例分割方法的端到端车道线检测 论文+代码解读

热门文章

  1. android studio报错Error:Project with path 'XXXX' could not be found解决办法
  2. TI CC32XX SDA中SimpleLink Academy教程翻译(RTOS部分的基础介绍非常易懂)
  3. linux账号安全管理,保证Linux系统安全——帐号管理
  4. vscode的搜索技巧
  5. 奥迪坚助力富友集团搭建 “收件宝”客服系统平台
  6. 洛谷 P1536 村村通
  7. HIT-CSAPP大作业:程序人生-Hello’s P2P
  8. ”linux学习之路” (感觉写的很好,更像是网络编程学习路线图)
  9. java课后习题答案_《java课后习题答案》.doc
  10. Julia:如何调用其他sub文件中的函数