自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 收藏
  • 关注

原创 Leecode刷题笔记——面试题32 - II. 从上到下打印二叉树 II

思路如下:采用递归求解,定义一个int的depth记录层数,每一层一个ArrayList。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { List<List.

2020-06-07 16:54:21 206 1

转载 回溯法基本框架

LinkedList result = new LinkedList();public void backtrack(路径,选择列表){ if(满足结束条件){ result.add(结果); } for(选择:选择列表){ 做出选择; backtrack(路径,选择列表); 撤销选择; }}作者:ming-zhi-shan-you--m9RfkvKDad链接:https://leetcode-cn.c

2020-06-04 09:30:35 277

原创 Leecode刷题笔记——26. 删除排序数组中的重复项

思路:1、原地修改数组,考虑快慢双指针2、注意快慢双指针的初始化值class Solution { public int removeDuplicates(int[] nums) { if(nums.length==0){ return 0; } if(nums.length==1){ return 1; } int n = nums.length; .

2020-05-17 10:14:14 213

原创 Leecode刷题笔记——435. 无重叠区间

思路如下:1、要求移除区间的最小数量,即求不重叠区间的最大数量2、对二维数组按照每个元素的end值从小到大排序3、贪心算法,要求每一个元素的start值要大于等于前一个元素的end值,这两个元素即形成2个不重叠区间,从头遍历找到不重叠区间的最大数量。class Solution { public int eraseOverlapIntervals(int[][] interval...

2020-04-27 22:51:15 161

原创 Leecode刷题笔记——322. 零钱兑换

思路如下:1、典型的动态规划自下而上2、dp数组定义:dp[i]表示i元能兑换的最小零钱个数class Solution { public int coinChange(int[] coins, int amount) { if(coins.length==0){ return -1; } int[] dp=n...

2020-04-24 17:37:31 99

原创 Leecode刷题笔记——454. 四数相加 II

思路如下:1、如果采用4层for循环那么时间复杂度会很高2、可以考虑将A、B之和与该和出现的次数用一个HashMap存储,然后对遍历C、D之和,如果C、D之和是HashMap中某一个键的相反数,那么就取出该键key的值value,即出现的次数。3、求出所有的次数和即为结果。class Solution { public int fourSumCount(int[] A, int[...

2020-04-24 00:06:51 153

原创 Leecode刷题笔记——395. 至少有K个重复字符的最长子串

思路如下:1、求子串问题,可以考虑采用递归拆分子串的分治算法,将字符串拆分求得符合要求的最长字串2、先定义一个int数组存储26个字母出现的次数,然后使用头尾指针从两端开始遍历,如果两端的指针对应的字符次数小于k,则指针向中间移动。3、第2步得到一个新的子串,从头遍历,如果发现有一个字符出现次数小于k,则以此字符为分界对子串进行拆分递归。class Solution { publ...

2020-04-23 23:13:54 123

原创 Leecode刷题笔记——384. 打乱数组

思路如下:1、重设数组,只需要定义一个int的orignal数组存储初始的nums即可。需要特别注意,在重设的时候,将original赋给nums之后,需要重新对orignal调用clone()方法指向一个新的地址,否则会因为对nums的修改,使得orignal也被修改2、打乱数组,应用洗牌算法即可洗牌算法class Solution { //将传入的nums放入array中变为全局变...

2020-04-23 18:33:18 117

原创 Leecode刷题笔记——380. 常数时间插入、删除和获取随机元素

思路如下:1、定义一个ArrayList存储即可。2、注意要熟悉随机数Random的用法。class RandomizedSet { ArrayList<Integer> list; /** Initialize your data structure here. */ public RandomizedSet() { list=new ...

2020-04-23 16:51:28 127

原创 Leecode刷题笔记——378. 有序矩阵中第K小的元素

思路如下:1、查找第k小的元素,考虑使用优先队列PriorityQueue2、需要注意,PriorityQueue没有poll(),添加元素要使用add()方法class Solution { public int kthSmallest(int[][] matrix, int k) { int m=matrix.length; int n=matr...

2020-04-23 15:59:25 127

原创 Leecode刷题笔记——341. 扁平化嵌套列表迭代器

思路如下:1、要求按照从前到后的顺序进行遍历,因此可以考虑使用LinkedList存储。2、由于可能存在多维的Node,因此可以考虑采用递归/** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about i...

2020-04-23 11:48:56 92

原创 Leecode刷题笔记——328. 奇偶链表

思路如下:1、建立两个辅助结点,一个连接奇数结点,一个连接偶数结点,再将偶数链表的头结点接到奇数结点末尾即可2、边界条件为head为空图片来源/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(...

2020-04-22 14:05:13 96

原创 Leecode刷题笔记——324. 摆动排序 II

思路如下:1、创建两个PriorityQueue,一个堆内存储“大于等于中位数的数”,一个堆存储“小于等于中位数的数”。根据堆的性质,堆的首元素总是当前堆内元素的最小值,不停的poll交叉插入数组即可得到最终结果。2、边界条件是nums长度为0或者13、注意考虑nums长度为奇数或者偶数的情况,如果是奇数就先放小的数,偶数就先放大的数(从最右边开始放的话)class Solution ...

2020-04-22 12:31:58 140

原创 Leecode刷题笔记——230. 二叉搜索树中第K小的元素

思路如下:二叉搜索树的中序排列即为从小到大的排列,用一个List存储即可。由于题目中保证k总是有效,因此无边界条件。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * T...

2020-04-20 23:56:40 80

原创 Leecode刷题笔记——227. 基本计算器 II

思路如下:1、考虑采用栈解题。2、对于±符号,对于一个数a,可以将其a或者-a的形式放入栈中3、当遇到 */符号,取出栈顶元素,将其与当前数字进行相乘或者相除,得到结果放回栈中4、遍历完整个字符串后,将得到的栈中的每个元素相加即可得到结果class Solution { public int calculate(String s) { Stack<Inte...

2020-04-20 23:26:11 107

原创 Leecode刷题笔记——371. 两整数之和

思路如下:1、加法运算,分为两部分,一个是同一位上两个数字和得到的各位,一个是进位。2、二进制算法中,异或^可以用来表示相加得到的个位,与&、左移1位可以用来表示进位3、通过两个数不断地异或运算,直到进位为零时,即可算出最后的和4、二进制加法class Solution { public int getSum(int a, int b) { //进位为0则退出循...

2020-04-20 00:31:13 172

原创 Leecode刷题笔记——190. 颠倒二进制位

思路如下:1、每次取当前值n的末位,算法为n&12、记录每次要移动的位数size,对n&1左移(<<)size个位置3、移动完一次后,n无符号右移一位4、关键是对<<,>>,&这些二进制符号的理解public class Solution { // you need treat n as an unsigned val...

2020-04-19 23:52:56 85

原创 Leecode刷题笔记——179. 最大数

思路如下:1、使用一个String数组将nums数组复制过来2、通过重写compare方法对两个String参数的大小进行比较,注意是要比较ab和ba的大小。大的放前面,保证重组后的字符串最大class Solution { //重写比较函数,用于得到两个字符串的先后顺序 private class largestNumberComparator implements Comp...

2020-04-19 23:09:19 141

原创 Leecode刷题笔记——166. 分数到小数

思路如下:1、边界条件为当除数被除数为0时,返回0。2、先求整数部分存入StringBuilder中。3、求出余数,定义一个HashMap存储键(除数的值)值(除数出现在StringBuilder中的位置),一旦出现新的余数已经在表中出现,说明出现了循环,需要添上括号;反之不断相除直到余数为0。4、需要注意的是余数每次都要自乘10才可以重新做一次除法。class Solution {...

2020-04-19 00:40:18 102

原创 Leecode刷题笔记——162. 寻找峰值

思路如下:logN的时间复杂度,可以考虑采用二分法,不断逼近峰值对应下标。比较nums[mid]与nums[mid+1]的大小,如果前者小于后者,则mid的右边一定存在峰值;如果前者大于后者,则mid左边一定存在峰值。class Solution { public int findPeakElement(int[] nums) { //边界条件 i...

2020-04-18 23:07:16 100

原创 Leecode刷题笔记——150. 逆波兰表达式求值

思路如下:考虑采用栈进行求解class Solution { public int evalRPN(String[] tokens) { Stack<String> stack=new Stack<>(); for(int i=0;i<tokens.length;i++){ //加法 ...

2020-04-18 21:52:49 97

原创 Leecode刷题笔记——148. 排序链表

思路如下:对于链表O(nlogn)的排序,考虑采用快慢指针找到中点,再使用归并排序进行排序。其中要注意递归使用方法。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = ...

2020-04-18 00:26:00 122

原创 Leecode刷题笔记——138. 复制带随机指针的链表

思路如下:深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。题目要求深拷贝,即重新写一个一模一样的head出来。我们可以考虑采用HashMap来实现深拷贝。先建立各结点,然后再将各结点连接起来。/*// Definition for a Node.class Node { int val; Node next; Node r...

2020-04-16 00:20:52 79

原创 Leecode刷题笔记——134. 加油站

思路如下:1、定义一个总的剩余油量变量total_tank和当前剩余油量变量cur_tank,分别用来记录所有加油站油量减去消耗油量的值 与 以某个加油站为起点的当前剩余油量。前者用来保证循环下来剩余油量不为负,后者用来保证能有充足的油量到下一个加油站。2、原理说明class Solution { public int canCompleteCircuit(int[] gas, i...

2020-04-15 23:10:27 144

原创 Leecode刷题笔记——131. 分割回文串

思路如下:由题意可以画出一个递归树图片来源1、从头遍历字符串,得到所有可能的截取情况。2、先判断截取出来的字符是否是回文数,如果不是,说明不是回文,不能这么分割3、如果判断出来是回文数,先把截取的部分存入path中,然后对剩下的子字符串进行递归4、递归终止条件是遇到空字符串,即索引为s.length()时5、注意每条路经走到底要剪枝,进行回溯class Solution { ...

2020-04-12 17:37:11 108

原创 Leecode刷题笔记——130. 被围绕的区域

思路如下:1、被围绕的区间不会存在于边界上,这意味着不与边界的O相连的O要转变为X,因此我们可以寻找所有与边界O相连的O,先置为#,然后再对二维数组遍历,将剩下的O变为X之后,再把#变为O即可。2、这里用到的方法是bfs广度优先算法,需要注意熟练使用。class Solution { public void solve(char[][] board) { if(bo...

2020-04-12 14:44:44 89

原创 Leecode刷题笔记——116. 填充每个节点的下一个右侧节点指针

思路如下:分析二叉树,有三种情况:1、最右边的结点指向null2、同一父节点的两个子节点由左指向右3、不是同一父节点的两个相邻子节点由左指向右由此可得到三种递归方法,分情况进行调用/*// Definition for a Node.class Node { public int val; public Node left; public Node rig...

2020-04-12 12:31:34 67

原创 Leecode刷题笔记——91. 解码方法

思路如下:明显可以使用递归,从前到后遍历分情况讨论:1、只要遇到0,说明无匹配字母,是无效的,直接返回0。2、例如22678,起始索引0,第一次递归有两种可能2,2678和22,678,即可以进行向下递归。但是要注意第二种情况22是小于等于26的,即是合法的,因此可以计入递归中。反之例如 28678,第一次递归只有一种可能2,8678,因为28,678不合法,28大于了26,无匹配字母,...

2020-04-12 00:18:06 264

原创 Leecode刷题笔记——73. 矩阵置零

思路如下:1、定义两个HashSet分别表示某行和某列是否存在0;2、第一次遍历二维数组,若为0,则HashSet中新增对应行数和列数3、第二次遍历二维数组,若遍历的当前位置的行数或者列数存在于HashSet中,则置0class Solution { public void setZeroes(int[][] matrix) { int m=matrix.leng...

2020-04-11 15:52:31 68

原创 Leecode刷题笔记——8. 字符串转换整数 (atoi)

思路如下:1、先把开头的空格去掉2、定义一个布尔字段判断是否是有负号,有则置false3、遍历数字,遇到非数字则停止遍历,注意判断超界的技巧:if(res>(Integer.MAX_VALUE-tmp)/10)class Solution { public int myAtoi(String str) { str=str.trim(); ...

2020-04-11 14:46:37 70

原创 Leecode刷题笔记——54. 螺旋矩阵

思路如下:1、可以看到,遍历的方向是右→下→左→上→右…方向的变化是有规律的,因此我们可以使用两个分别表示x、y方向的数组来定义遍历的方向2、可以发现,在遇到边界,或者是遇到已经遍历过的数的时候,就会改变方向,因此再定义一个布尔数组表示当前坐标是否已经遍历过class Solution { public List<Integer> spiralOrder(int[][]...

2020-04-11 12:32:43 88

原创 Leecode刷题笔记——50. Pow(x, n)

解题思路:快速幂算法(递归)class Solution { public double myPow(double x, int n) { long N = n; //需要注意n如果为−2的31次方,转为整数会溢出,因此要用一个long型N if (N < 0) { x = 1 / x; ...

2020-04-11 00:18:36 111

原创 Leecode刷题笔记——36. 有效的数独

思路如下:1、建立三个HashMap数组,分别用于表示 行、列、和33格子,每个HashMap用于维护各行或者是是各列或者是各33格子中1—9及其出现的次数2、需要注意的是,对于3*3格子的index索引定义应该如下:int boxIndex=(i/3)*3+j/3;//i为行数,j为列数,表示box索引从左到右增加,如下图:图片来源:图源class Solution { ...

2020-04-10 22:34:34 143

原创 Leecode刷题笔记——394. 字符串解码

思路如下:定义一个StringBuilder类型的res和整型multi用于记录字符串和数字遍历每个字符c,有如下情况:1、字符为字母时:res.append©2、字符为数字时:c转为数字赋给multi3、字符为‘[’:将res和multi分别存入两个栈中,并把res、multi置空置0,用于后续重新使用4、字符为‘]’:定义一个局部变量StringBuilder类的tmp,把r...

2020-04-09 19:26:40 126

原创 Leecode刷题笔记——347. 前 K 个高频元素

思路如下:1、首先用HashMap存储每个key及其对应的个数value2、使用优先队列PriorityQueue,重写比较方法,把map的key从大到小进行排列。3、使用List获取queue中的结果,Collections.reverse(list)将其倒序。4、关键是要想到用PriorityQueue优先队列解题。class Solution { public List&...

2020-04-09 17:11:52 72

原创 Leecode刷题笔记——338. 比特位计数

思路如下:参考191题即可,这里只是要求把每个数字i的二进制1的个数存储成数组返回即可。Leecode刷题笔记——191. 位1的个数原题地址:338. 比特位计数...

2020-04-08 22:35:40 143

原创 Leecode刷题笔记——191. 位1的个数

思路如下:对于一个数n,我们发现对于n-1,n与其的二进制末尾一定是相反的,例如5和4对应二进制分别为101和100,末尾值分别为1和0,我们只需要对101进行与100的位与操作,便可以消除掉一个1,然后我们定义一个整型count记录1的数目,将count++。此时101变为100,再对100进行二进制-1操作得到11,100与11进行位与,并修改count++直到输入的n变为0即可。pub...

2020-04-08 22:19:43 174

原创 Leecode刷题笔记——337. 打家劫舍 III

思路如下:相邻房屋不能偷,即对于一个爷爷结点,要么偷爷爷与孙子,要么只偷儿子,比较两者最大值,利用递归求解。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNo...

2020-04-08 21:35:08 107

原创 Leecode刷题笔记——300. 最长上升子序列

思路如下:1、为了找到上升序列最大值,考虑动态规划。2、关键是状态转移方程。借下图:可以得到dp初始化为1,因为每个数字都可以自成一个子序。两层for循环,每次遍历一个i,就比较当前nums[i]与nums[j]的大小(0=<j<i),如果nums[i]>nums[j],则说明nums[i]与nums[j]可以构成一个子序列,接着对dp[i]进行讨论。dp[i]表示...

2020-04-08 17:24:08 99

原创 Leecode刷题笔记——287. 寻找重复数

思路如下:维护一个HashMap,遍历赋值,查询出value大于1的那个key即为所求。为什么不用ArrayList?因为ArrayList查询很慢,用HashMap更快。class Solution { public int findDuplicate(int[] nums) { Map<Integer,Integer> map=new HashMap...

2020-04-08 16:18:46 99

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除