![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode刷题笔记
刷leetcode的一些笔记
Pedalo-x
计算机研究生
展开
-
2021-03-02
本题可以先不急着使用代码实现,可以试着在纸上看看怎么还原,不难发现,前序遍历的第一个数3,可以把中序遍历划分为两部分,左边是左子树,右边是右子树。3则是根节点。而左右子树又可以用同样的方法继续划分,所以可以使用分治思想来解题。为了减少遍历,可以将中序遍历放在map里,这样可以在时间复杂度为O(1)中计算得出前序遍历某一个数在中序遍历数组中的下标。下图是计算前序遍历左子树范围和中序遍历左子树范围,以及右子树范围… … 方便将它们当做完整的子树的前中序遍历传入递归子函数。class Solution {.原创 2021-03-02 13:22:22 · 79 阅读 · 0 评论 -
448. 找到所有数组中消失的数字
这道题要解答还是很简单的,直接hash,但是要让空间复杂度为O(1),忽略返回的List的大小,还是稍微动一下脑筋的。具体思路就是:将原始数组作为hash的结构,就不用新开空间了。遍历数组,由于数组中数字的范围是1~n,与数组中每个元素下标可以一一对应。将遍历到的数组的数字减一与n求余,范围就是0~n-1,然后将该数字作为数组下标,将下标对应的数字加n最后重新遍历数组,小于等于n的数字的下标就是没出现过的数字代码如下import java.util.ArrayList;import .原创 2021-02-13 18:30:27 · 62 阅读 · 0 评论 -
替换隐藏数字得到的最晚时间xx:xx
这道题有点坑,头两位数字,不能直接设置它为可能的最大数字,而是要考虑其另一位的数字。比如第一位是2,则第二位就不能是9,而第一位是1,第二位就可以是9原创 2021-01-24 15:55:20 · 132 阅读 · 0 评论 -
使得字符串a所有字符均小于字符串b,所需要改变的次数,a,b均只含有小写字母
这道题看似比较难,实际上只要有思路就可以很快写出来。以a 小于 b为例。假设字母表中的第i位为a的上界,则b的上界应该为i+1。a的上界最多为y,因为a需要严格小于b。如果a的上界为i,则a从i + 1开始的元素就需要改变。则a需要改变的次数为countA[i+1]到count[26]的累加。同理,b需要改变的元素个数为countB[0]到count[i]的累加,使其都严格大于字母表第i个元素。/** * @author: Xie * @Description: TODO * @Date: 2.原创 2021-01-24 15:48:46 · 157 阅读 · 0 评论 -
交换数组的汉明距离
该题初看很难实现,但是想到并查集就不难了。这道题从给出的allowedSwaps入手,可以想象有sourced的长度个点,这些点通过allowSwaps构成图,只要得出图的哪些部分是联通的,则这些部分的值可以任意交换,只要得出这些集合中,在source里却不在target里的元素的个数,就是该集合的汉明距离,最后将这些不想交集合的汉明距离统计起来即可。最初用list来统计集合内的元素,结果超时了,后面用map进行优化。...原创 2021-01-11 16:57:33 · 126 阅读 · 0 评论 -
旋转数组问题
该题如果空间复杂度为O(n)的话就比较简单,但是如果要使空间复杂度为O(1)则有如下两种方法。方法一数组为[1,2,3,4,5,6,7],数组长度ll为7,k为2观察移动过后,假设将数组分为[0,1]部分1和[2,7]部分2,则部分1会在部分2后面去。所以先将数组整体翻转得到:[7,6,5,4,3,2,1]。然后再将[0,1]部分和[2,7]部分翻转,得到[6,7,1,2,3,4,5],也就是结果。class Solution { public static void rotate(in.原创 2021-01-08 17:31:11 · 102 阅读 · 0 评论 -
给你一个整数数组 nums ,返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。
题目思路:每个数有两种情况,取或者不取。所以一共有2的n次方种解法。可以联想到二进制来表示,所以遍历0到2^n-1,然后将其转为二进制字符串。二进制位上为1的就取,不为1的就不取。但是有个问题,java的Integer.toBinaryString函数,前面不会补0,只会保留最高位0,所以倒着取。要计算一下二进制的长度,与num的长度,取个差值,最后才能索引回去其在num里的原始位置。不然最高位一直都是1,num索引0也一直存在。代码如下package practice;import j原创 2021-01-05 11:16:24 · 1833 阅读 · 3 评论 -
java中的优先队列PriorityQueue使用详解
虽然称PriorityQueue为队列,但是其实它和队列关系并没有太大,称它为小顶堆更合适。因为其中的数据都会按完全二叉树进行小顶堆构造,当插入新数据的时候会自动将数据插入到合适的位置来保证是一个小顶堆。注意,队列中的数据不一定有序,但是每次弹出来的一定是最小(最大)的值。它的常用方法如下:add:插入队尾元素,不成功会抛出异常offer:插入队尾元素,不能被立即执行的情况下会返回true 或 falseremove:删除队头元素,如果不成功会返回false。poll:删除队头元素,并返回删除原创 2021-01-04 11:03:44 · 410 阅读 · 0 评论 -
java数组转List,List转数组
一、整型1.整型数组转ListList<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());2.List转整型数组int[] arr = list.stream().mapToInt(Integer::valueOf).toArray();原创 2020-12-30 09:40:32 · 205 阅读 · 0 评论 -
双端队列Deque java
Deque支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。函数名添加功能push(E)向队头插入一个元素offerFirst(E)向队列头部加入一个元素offerLast(E)向队列尾部加入一个元素函数名获取功能peekFirst()获取队列头部元素peekLast()获取队列尾部元素函数名删除功能removeFirstOccu原创 2020-12-23 09:57:05 · 114 阅读 · 0 评论 -
使用队列的一个典型题(leetcode 649.DOTA2)
比如:输入:“DRRDRDRDRDDRDRDR”需要从头遍历,中间会删除,然后没有达到要求又会继续从头遍历。这种题就比较适合使用队列。解题代码如下:public static String predictPartyVictory(String senate) { int len = senate.length(); Queue<Integer> queueR = new LinkedList<>(); Queue<Integer> qu.原创 2020-12-11 14:40:57 · 161 阅读 · 0 评论 -
排序算法总结(归并排序,快速排序,堆排序)
存原创 2020-12-09 21:15:36 · 276 阅读 · 0 评论 -
倒序遍历Map
ListIterator<Map.Entry<Integer, List<Character>>> li = new ArrayList<>(map1.entrySet()).listIterator(map.size());while(li.hasPrevious()) { // 如果还有前面的就往前遍历 Map.Entry<Integer, List<Character>> entry = li.previous();原创 2020-12-05 11:05:32 · 1987 阅读 · 0 评论 -
位运算在完全二叉树节点计算上的应用
先上leetcode的题目这道题可以直接遍历二叉树来计算节点数。但是由于题目中说了是完全二叉树,所以可以考虑优化算法,使用位运算。整体思想从根节点出发,每个节点只有两种走法,向左或者向右,可以联想到二进制要么为0,要么为1。由于是完全二叉树,所以二叉树的层高h一定是最左边节点的深度。规定根节点在第0层。则第h层至少有1个节点,至多有2h{2}^{h}2h个节点。所以二叉树的节点总数最少为:最多为:把根节点编号为1,然后从左到右,从上往下编号。如下图是一个拥有5个节点,高度为2的完全二叉树。原创 2020-11-25 14:21:15 · 196 阅读 · 0 评论 -
leetcode 406. 根据身高重建队列(二维数组排序,list排序,list转数组,数组转list)
该大佬解题思路以及解题代码都非常精妙,遂记录于此学习。目录一、解题思路:二、解题核心代码三、二维数组排序四、list排序五、list转数组六、数组转list一、解题思路:将人群的身高按降序排列,k按升序排列。然后创建一个有序的list,将每个人按其k值插入list,全部插入完成以后即可得到结果。解释:由于前面的人数已经是按降序排列了,所以插入到位置k后,前面一定有k个大于等于其身高的人。前提是k按升序排列!!// [7,0], [7,1], [6,1], [5,0], [5,2], [4,.原创 2020-11-16 11:41:40 · 262 阅读 · 0 评论 -
图的深度优先遍历DFS、广度优先遍历BFS细解说(邻接矩阵+链表两种存储方式,递归+非递归)
这里写目录标题一、图的深度优先遍历1.邻接矩阵法一、图的深度优先遍历1.邻接矩阵法原创 2020-11-10 11:47:58 · 327 阅读 · 0 评论 -
并查集(超级简单直观)按秩合并,路径压缩
本文参考了大神文章https://blog.csdn.net/iteye_9214/article/details/82099516应该这就是原创了,网上有很多人模仿着写。leetcode上的这道题,是并查集最简单直观的使用。简单来说,在基于已经构建好的关系网,要直接判断A和B是否是好朋友很难,但是如果可以知道A和C是好朋友,B和C也是好朋友,那么A和B自然也是好朋友了。但是人多了怎么办呢。可以在每个朋友圈找出一个孩子王,那么只要知道两个人的孩子王是否一样就可以判断他们是否是好朋友。基于这个思路可以得.原创 2020-11-08 22:43:02 · 493 阅读 · 2 评论 -
leetcod 129. 求根到叶子节点数字之和
题目给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。思路首先想到要遍历二叉树,这里用到前序递归遍历。递归时用字符串拼接的方法进行“累加”。每次递归判断是否到叶子节点,如果是,则将累加的字符串转为整型,加到totalsum里去。否则继续遍历。最后遍历结束返回totalsum。代码如下(在i原创 2020-10-29 10:50:57 · 88 阅读 · 0 评论