自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

G_drive的博客

梦想世界,在你手中

  • 博客(47)
  • 收藏
  • 关注

原创 LeetCode刷题目录(Java)

LeetCode刷题笔记(Java)题解留言与讨论这是我第一次系统地写关于OJ的刷题笔记,一方面是想与大家一起学习、一起讨论关于算法的知识,一方面也是为了督促我在这条路上坚持走下去。如果大家有任何疑问,欢迎留言与我一起谈论。希望大家都能在算法之道上走的更远。题解题号题目题解分类备注2两数相加Java1两数之和JavaHash表留言与...

2019-04-01 15:25:13 1411 1

原创 876、链表的中间结点

问题描述问题分析分析题目,看到单链表且求中间结点,立即推!快慢指针法!用两个指针 last 与 fast 一起遍历链表。last 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,last 必然位于中间。解法:快慢指针时间复杂度:O( n ),其中n表示数组的长度,只需要遍历n/2个结点。空间复杂度:O( 1 ),只需要常数空间存放两个变量last和fast即...

2020-03-23 11:25:54 239

原创 47、全排列 II

问题描述问题分析分析题目,全排列问题都是用经典的回溯法,这里可以结合46题一起看,多思考思考这里的减支思想:在处理数组中重复元素的时候,要先将数组排序,排序以后在数组重复元素都相邻在一起。造成重复结果的原因是当前元素和前一个元素是相同的,并且选完当前元素后,前一个元素还可以选。即:第一次取是先选了前一个元素,然后又选了当前这个元素(两者相同),形成一个解;由于回溯,第二次取的时候,先...

2019-12-19 10:20:55 166

原创 46、全排列

问题描述问题分析分析题目,这是一道经典的回溯法题目:backtrack(res, nums, tmp, visited);res是结果集nums是候选集tmp是当前路径visit是访问控制集基本算法思路是backtrack(res, nums, tmp, visited){ //回溯结束条件(一般是tmp长度符合条件) if(满足条件){ res添加路径tmp; ...

2019-12-18 10:22:05 209

原创 24、两两交换链表中的节点

问题描述问题分析分析题目,考的是对链表的操作。对于两两交换链表节点,可以如下考虑:解法:链表时间复杂度:O( n ),其中n表示链表的长度。只用遍历一遍链表。Java代码package com.company;public class Main { static public class ListNode { int val; ...

2019-12-13 11:10:05 159

原创 108、将有序数组转换为二叉搜索树

问题描述问题分析分析题目,由于求的是二叉搜索树,我们立即想到二叉搜索树的性质:左子树的一切元素都比根节点小,右子树的一切元素都比根节点大,且所有的子树左右子树的节点数相差不超过1个。结合题目所给的有序数组,很容易想到把数组从中间分成两半,中间的元素是根节点,左边的数组是左子树,右边的数组是右子树。然后可以发现,这是经典的分治法。解法:分治法时间复杂度:O( n ),其中n表...

2019-12-11 13:27:06 213

原创 107、二叉树的层次遍历 II

问题描述问题分析分析题目,使用BFS和DFS都可以,这里使用DFS:首先构建DFS(当前节点root,层次level, 树形List, 数值List)。BFS分树形List和数值List的原因是,按照树形List的父子结构进行DFS,然后把每个节点的val存入数值List中,作为结果返回。DFS的思想:自顶向下,依次对每一个节点进行DFS,能进就进,不能进就退,然后选择兄弟节点进行DF...

2019-12-11 11:32:13 174

原创 104、二叉树的最大深度

问题描述问题分析这是一个经典的分治类型的题目。使用分治法,直接将求整个树的高度的问题分解为求两个子树的高度问题,层层递归,即可求出整个树的高度。树的高度 = max(左子树的高度,右子树的高度)+ 1;解法:分治法时间复杂度:O( n ),其中 n 是结点的数量。Java代码package com.company;public class Main { stat...

2019-12-10 23:02:14 756

原创 101、对称二叉树

问题描述问题分析考察的是树的递归。对于一个二叉树tree,有左子树left,有右子树right,它符合对称二叉树的递归条件是:left和right的根节点相同left的left与right的right对称left的right与right的left对称解法:递归时间复杂度:O( n ),其中 n 是树中结点的总数(因为遍历整个输入树一次)。Java代码package c...

2019-12-08 10:40:05 161

原创 100、相同的树

问题描述问题分析水题,考察基础的递归。解法:递归时间复杂度:O( n ),其中n表示树节点的个数。Java代码package com.company;public class Main { static public class TreeNode { int val; TreeNode left; Tre...

2019-12-08 09:54:39 126

原创 88、合并两个有序数组

问题描述问题分析水题,直接依次比较两个数组的数字即可,较大者放在nums1数组的最后面、解法:简单模拟时间复杂度:O(m + n ),其中m,n分部表示两个数组的长度。Java代码package com.company;public class Main { public static void main(String[] args) { int...

2019-12-08 09:08:05 153

原创 83、删除排序链表中的重复元素

问题描述问题分析链表的简单模拟。就不过多赘述了。解法:简单模拟时间复杂度:O( n ),其中n表示链表的长度。空间复杂度:O( 1 )Java代码package com.company;public class Main { public static class ListNode { int val; ListNode nex...

2019-12-07 16:27:52 128

原创 70、爬楼梯

问题描述问题分析最基础的动态规划问题。状态转移方程如下:dp[i] = dp[i-1] + dp[i-2];解法:动态规划时间复杂度:O( n ),其中n表示数组的长度。空间复杂度:O( n ),其中n表示数组的长度。Java代码package com.company;public class Main { public static void main(St...

2019-12-07 16:01:41 124

原创 69、x的平方根

问题描述问题分析如果直接用暴力遍历法。会超时。考虑使用二分查找法(采用二分!!不是分治!!!搞清楚两者的区别!!)。二分查找没有什么可说的。说一下这个题目的一些坑:使用 x/mid < mid 而不是 mid*mid>x,防止int型溢出使用 x/mid < mid 而不是 x/mid > mid,首先从max开始缩小,若首先从min开始扩大会产生问...

2019-12-07 11:34:44 189

原创 67、二进制求和

问题描述问题分析简单模拟一下二进制相加的过程即可,思路如下:两个字符串长度对齐:短的字符串前面补0,直到和长的字符串对齐。逐项相加:相加情况只可能是0、1、2、3。特殊情况处理:头部若需要进位,那么得在头部额外添加一位。解法:简单模拟时间复杂度:O( max(a_length, b_length) ),其中a_length、b_length分别表示两个字符串的长度。Ja...

2019-12-07 09:41:59 182

原创 66、加一

问题描述问题分析只是一道水题,练习一下BigInteger的用法。解法:BigInteger时间复杂度:O( n ),其中n表示数组的长度。Java代码import java.math.BigInteger;public class Main { public static void main(String[] args) {// int[] di...

2019-12-06 20:33:43 169

原创 58、最后一个单词的长度

问题描述问题分析完全是一个水题,倒着遍历找空格即可。注意,需要处理一下尾部的空格。解法:水题时间复杂度:O( n ),其中n表示数组的长度。Java代码public class Main { public static void main(String[] args) { String s = "Hello World";// Stri...

2019-12-06 16:41:04 135

原创 53、最大子序和

问题描述问题分析使用动态规划来解题是比较常见的思路,不多赘述了。这里考虑使用贪心的思想;首先要搞清楚一个概念:增益。假设现在有一个连续子序列N,和接下来的一个数字a。我们知道,要得到最大的子序列和,我们首先要判断a的值是否大于0,若a大于0,这说明a对于N的和有正向增益,两者结合起来的和肯定比原来的N要大,那么这个a就可以添加到子序列N中来,这样我们就找到了一个更大的子序列和,然后继续迭代...

2019-12-06 16:04:14 191

原创 38、报数

问题描述问题分析分析题目,是一个简单模拟的题目,主要难度在于理解题意。题意:第一个数是1;由于上一个数“1”是1个1,所以第二个数是11;由于上一个数“11”是2个1,所以第二个数是21;由于上一个数“21”是先1个2,再1个1,所以第二个数是1211;依次类推简单模拟的方法就是读数的方法,我就简述一下思路:首先定义外循环和内循环。外循环依次定义results[30]这...

2019-12-02 22:40:41 155

原创 35、 搜索插入位置

问题描述问题分析分析题目,典型的二分查找。解法:二分查找时间复杂度:O(logn),其中n表示数组的长度。Java代码class Solution { public int searchInsert(int[] nums, int target) { int start = 0; int end = nums.length - 1; ...

2019-12-01 23:09:46 163

原创 28、实现strStr()

问题描述问题分析分析题目,和前几个题目的思路一脉相承。我就简述一下思路:将数组排好序,用双层循环分别先确定第一个数和第二个数,在剩余元素集合的首尾指针i、j的对撞过程中,计算四数之和:若结果等于target,则表示找到一个解;若结果大于target。则表示j指针所指元素偏大,需右移,j–;若结果小于target。则表示i指针所指元素偏小,需左移,i++;解法:对撞指针时间复杂...

2019-11-19 00:19:03 148

转载 Arrays.sort()排序算法分析

Arrays.sort()排序算法分析Arrays.sort()根据入参类型选择以下排序算法基本类型数组使用快速排序对象数组使用归并排序原因使用不同类型的排序算法主要是由于快速排序是不稳定的,而合并排序是稳定的。这里的稳定是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列。对于基本数据类型,稳定性没有意义,而对于对象类型,稳定性是比较重要的,因为对象相等的判断可能只是判断...

2019-11-03 22:21:03 437

原创 26、删除排序数组中的重复项

问题描述问题分析分析题目,主要有两个要考虑的问题:“如何原地删除重复元素”,以及“如何计数”。我们知道,在对排序数组进行遍历时,指针所指的值只会“相等”或者“变大”。若相等,即发现重复元素;否则为非重复元素。基于以上思路,可以使用双指针法。一个指针为基准指针index,指向当前已去重数组的最后一位。另一个指针为游标指针cur,指向原数组中依次遍历到的元素。在cur从头遍历至数组末尾的过程中...

2019-07-08 17:47:13 166

原创 23、合并K个排序链表

问题描述问题分析一看到这种合并K个数组/链表的题目,立即就要想到分治法:合并K个链表,可理解为先将其划分为两组K2\frac{K}{2}2K​个链表分别进行合并,两个K2\frac{K}{2}2K​个链表又可以划分为四个K4\frac{K}{4}4K​个链表……直到划分为每组中只有一个链表,然后在将各组合并结果依次层层合并,即可得到最终合并结果合并图示如下(转载于官方题解):解法:...

2019-07-02 21:33:13 133

原创 22、括号生成

问题描述问题分析分析题目,括号生成的过程可以视为对一个空字符串不断添加“(“或”)”的过程。最直观的解法是使用暴力法:生成所有可能的括号组合,然后依次进行判断括号是否合法有效。我们可以尝试对暴力法进行优化:只有在合法有效的情况下才添加正反括号,而非暴力法的强行盲目的添加括号。基于以上考虑,我们采用回溯法的思路:**能进则进,进不了就换,换不了就退。**使用回溯法的关键是找到递归出口若当前...

2019-06-29 19:00:58 186

原创 18、四数之和

问题描述问题分析分析题目,和前几个题目的思路一脉相承。我就简述一下思路:将数组排好序,用双层循环分别先确定第一个数和第二个数,在剩余元素集合的首尾指针i、j的对撞过程中,计算四数之和:若结果等于target,则表示找到一个解;若结果大于target。则表示j指针所指元素偏大,需右移,j–;若结果小于target。则表示i指针所指元素偏小,需左移,i++;解法:对撞指针时间复杂...

2019-05-15 21:24:31 185

原创 17、电话号码的字母组合

问题描述问题分析分析题目,递归虽然简单,但是消耗了额外的空间,故还是选择遍历的办法。思路如下:每一次添加一个字母,把之前已经添加过的作为一个整体,再和新添加的字母组合(注意删去低维元素)。解法:Java代码class Solution { public List<String> letterCombinations(String digits) { ...

2019-05-11 11:12:14 179

原创 16、最接近的三数之和

问题描述问题分析分析题目,和上一个题目相似。我就简述一下思路:将数组排好序,固定第一个数,在另外两个指针的对撞过程中,如果三数之和距离target更近了,则更新;移动第一个数,重复上述过程。解法:对撞指针时间复杂度:O( n^2 ),其中n表示数组的长度。Java代码class Solution { public int threeSumClosest(int[] nu...

2019-05-10 16:28:06 218

原创 15、三数之和

问题描述问题分析分析题目,使用3个变量i、j、k暴力求解显然是不太现实的,想都不用想肯定超时。思考一番后,觉得可以改为a+b=-c,将时间复杂度降到O(n^2),而且使用对撞指针又可以提高性能。此题难点在去除重复的三元组,考虑了半天,最后还是老老实实用指针来去除重复三元组。算法思路如下:先对数组进行排序。数组被分为小于0、等于0、大于0三部分。首先使用first指针从左往右(从小到大...

2019-05-09 16:03:03 187

原创 14、最长公共前缀

问题描述问题分析分析题目,这种对于字符串处理的题,一般可以使用暴力法扫描,或者递归、分治。以下说几个常见的解法:水平扫描:若LCP(string_1,string_2)是按位依次比较来求取两个字符串的最长公共前缀,那最终结果即为LCP(LCP(LCP(…),String_n-1),String_n)。时间复杂度为O(S),S为字符串数组中字符的个数。纵向扫描:对于所有的字符串,同时按位...

2019-05-08 17:57:51 254

原创 13、罗马数字转整数

问题描述问题分析分析题目,这是一道水题。直接按照罗马数字的构造规则设计算法就可以了。算法思路如下:从所给字符串尾部开始,按字符依次往前扫描,判断:如果该罗马字符对应的数字大于或者等于上轮扫描的罗马字符对应的数字 ,则代表正常扫描,更新结果(加)。如果该罗马字符对应的数字小于上轮扫描的罗马字符对应的数字 ,则代表属于特例情况,更新结果(减)。Java代码class Soluti...

2019-05-07 16:04:41 238

原创 12、整数转罗马数字

问题描述问题分析分析题目,可以这样考虑:按照罗马字符所表示的范围进行分层,依次匹配罗马字符,然后更新原数字,迭代进行,最终得到结果。第一种解法:比较范围+迭代罗马字符所表示的范围为:1000-3999 M900-1000 CM500-900 D400-500 CD100-400 C90-100 XC50-90 L40-50 XL10-40 X9 IX5-9 V...

2019-05-07 11:31:18 157

原创 11、盛最多水的容器

问题描述问题分析分析题目,最直观的解法是暴力法,直接暴力搜索所有的线段组合情况,时间复杂度为O( n^2 )。int max = 0;int temp = 0;for (int i = 0; i < height.length; i++) { for (int j = i+1; j < height.length; j++) { temp = (j...

2019-05-06 16:17:03 185

原创 10、正则表达式匹配

问题描述问题分析分析题目,可以发现正则匹配每进一位的状态都是由前一个状态来决定的,所有我们可以用动态规划或者有穷自动机来求解。第一种解法:动态规划使用动态规划求解时,分析状态及变更情况,可知动态方程dp[ i ][ j ]中的 i 为被匹配字符串的下标,j 为匹配模式字符串的下标。动态方程如下:if(p[j-1] == ‘*’),1.1 dp[i][j] = dp[i][j-2...

2019-05-05 16:29:54 364

原创 9、回文数

问题描述问题分析分析题目,这是一个水题。最开始想的是将数字转为字符串来做,直接使用首尾游标遍历一半元素即可得出答案,特别方便。时间复杂度:O( n ),其中 n 是数字的长度。空间复杂度:O( 1 )Java代码class Solution { public boolean isPalindrome(int x) { if ( x < 0 ){ ...

2019-05-03 16:36:21 246

原创 8、字符串转换整数 (atoi)

问题描述问题分析分析题目,此题是数值处理的模拟题。处理逻辑稍微有点复杂,我真是被测试用例搞到自闭了…需要注意的地方有:关于最大值、最小值的定义:使用int INT_MIN = Integer.MIN_VALUE;而不是int INT_MIN = -(int)Math.pow(2,31);前者为-214783648,后者为-214783647。因为后者是用(int)Math.pow(2,...

2019-05-02 14:59:35 360

原创 7、整数反转

问题描述问题分析分析题目,此题考的是简单的数值处理,只用判断范围+取除取余即可。正好我对于Java的BigInterger不太熟悉,通过这个题目加深理解。也有其他方法,比如数字转为字符串之后在调用字符串反转方法,或者使用堆栈之类的,并没有太多技巧性的地方,就不过多赘述了。时间复杂度:O( log(n) ),x 中有 log10(x)位数字 。空间复杂度:O( 1 )Java代码i...

2019-05-02 10:56:21 169

原创 6、Z字形变换

问题描述问题分析分析题目,这是字符串处理的简单模拟。需要注意的地方是:String,StringBuilder以及StringBuffer的区别。运行速度快慢:StringBuilder > StringBuffer > String这是因为String是字符串常量,每次追加字符串时,都需要创建新的对象,原来的对象需要JVM的垃圾回收机制来处理,增加了时间和内存消耗;而...

2019-05-01 22:24:57 185

原创 4、寻找两个有序数组的中位数

问题描述问题分析题目要求输出合并后的数组的中位数,可以考虑这样的思路:设置两个游标,同时从两个数组从头遍历,依次比较游标所指向元素大小,将较小元素加入新数组中,然后较小元素对应的游标向后移动。当m+n是偶数的时候,游标需要移动(m+n)/2次;当m+n是奇数的时候,游标需要移动(m+n-1)/2次。需要注意的地方是:1、以上算法不适用于数组为空的情况,需要在此之前做出一些处理。2、当两个...

2019-04-01 21:26:35 506

原创 3、无重复字符的最长子串

问题描述问题分析因为要求子串中无重复字符,很容易可以想到利用滑动窗口机制。工作游标不断后移,每当遇到非重复字符,便将其纳入窗口内,窗口扩大;当遇到重复字符时,锚点需要后移到窗口中重复字符的后一位,由此保证窗口内的元素一定是无重复的。需要注意的是:当所给字符串为空串或者仅包含一个字符的时候,需要对滑动窗口进行很多处理。为了简洁,我们只做简单的判断来单独处理这种情况。时间复杂度:O(n), ...

2019-04-01 19:14:10 169

空空如也

空空如也

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

TA关注的人

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