自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode Q123 买卖股票的最佳时机 3

思路统一为三维数组的dp问题。dp[n][2][k] ,n为天数,第二维表示当天是否买入股票,k表示限制买卖的次数。每天的利润则取决于当天的操作。只有两种选择,操作或者不操作。不操作则直接和前一天利润相同。操作 则按操作的不同增减利润代码class Solution { public int maxProfit(int[] prices) { if(prices.length==0) return 0; int[][][] dp=new int[prices.l

2020-07-11 16:13:31 165

原创 剑指offer Q15 二进制中1的个数

思路本题要求计算出一个整数的二进制中的1的个数,考察的是位运算的运用和理解。本题会用到>>、>>>、&等运算符,不会的可以去查一下。本题的重点在于怎样去统计1的个数,其实这个和去计算一个数各位数之和类似(比如让你求39的各位数之和,也就是12)。那个题是循环取余法去取得各个位的值然后加起来即可,那么我们是否可以采用类似的方法呢?注意到本题的数实际上是在二进制上进行操作,而那个题是在10进制上进行取模10操作的.那类似的我们可以在二进制上进行取模2操作,这样就能

2020-06-20 18:48:58 191

原创 剑指offer Q10 -I 斐波那契数列

思路本题看起来是简单题,但是实际上对性能和结果都有要求直接使用递归写法性能上是不能通过的。只能使用迭代写法,通过两个变量re1和re2来保存前一步和前前一步的结果,最后返回re2即可。但是注意,本题的结果可能非常大,所以在每次进行计算的时候,都要对re2进行取模操作,防止溢出。###代码class Solution { public int fib(int n) { if(n<=1) return n; long re1=0,re2=1,re=0;

2020-06-20 10:42:46 174

原创 剑指offer Q07 重建二叉树

思路这是第二遍刷题了本题主要就是怎样从一个先序序列和一个中序序列怎样推导出一棵树。首先,从先序可以得到root结点就是第一个节点,然后到中序中去找其对应的位置inPos,然后该位置的左边就是root的左子树中序序列,右边就是root的右子树中序序列,且同时可以根inPos的位置计算出root的左子树序列的结点个数,就是inPos-inLeft=isize,然后可以推导出先序中其左子树序列的位置在preLeft+1到preLeft+isize,而其先序中右子树序列的位置在preLeft+isize+1到p

2020-06-18 20:52:49 108

原创 LeetCode 剑指offer Q68 -ll 二叉树的最近公共祖先

思路接着67题。这一题就是一般情况,就是一棵普通的二叉树没有顺序。那如何求解呢?比较容易想到的就是用dfs找到到达pq的两条路径,然后进行比对找到最近的相同点。但是这种方法在递归完之后还要进行处理效率比较低。我们设计一个递归函数dfs1)当当前节点root就是p或者q时,则直接返回该节点。2)分别递归进入root的左右子树得到两个节点left和right。这两个节点表示了左右子树...

2020-04-21 17:52:07 132

原创 leetCode Q68 -l二叉搜索树的最近公共祖先

思路这一题思路相对一般的二叉树而言比较简答。因为是二叉搜索树,肯定遵循左<中<右,因此我们可以使用递归对当前root、p、q的val进行大小判断,如果pq的值都小于root,那么可以判断pq的最近公共祖先还在root.left中,同上,如果pq的值都大于root,那么判断pq的最近的公共祖先都在root.right中.若以上两个都不符合,pq分别在root的两侧,则不需要再进行探索了...

2020-04-21 17:01:22 119

原创 LeetCode剑指offer Q66构建乘积数组

思路不能使用除法导致要想一个好的办法用对称数组解决。设 int left[]=new int[a.length],right[]=new int[a.length];left用来存放每个元素包括自己及其左边所有元素的乘积,right存放每个元素及其右边所有元素的乘积。这样,b[i]=left[i-1]*right[i+1];当然对于b[0]和b[b.length]需要进行初始化代码...

2020-04-21 14:01:04 138

原创 LeetCode 剑指offer Q65不用+-*/做加法运算

思路本题实际就是考察的位运算假设a=4,b=5二进制a 0100b 0101 其实在不考虑进位的情况下 a+b其实就是a^b=0001但这个和a+b的结果相差了个进位的情况a+b=9 1001a&b. 0001如何保留到它的进位 也就是 1001 我们如何能拿到这个进位1我们用&运算首先将a&b得到a和b各个位相同的情况,那这些相同的情况在...

2020-04-20 21:16:35 123

原创 LeetCode 剑指offerQ62圆圈中的最后一个数

思路看了解答区的大神的解答。采纳了一种。反推法。细节先不写了,没时间 后面补上。代码class Solution { public int lastRemaining(int n, int m) { int ans_index=0;//最后一轮只有一个数字就是留下的数字下标为0 for(int i=2;i<=n;i++){ ...

2020-04-20 19:17:48 103

原创 LeetCode 剑指offerQ56 -l 数组中数字出现的次数

思路首先,我们现了解^异或这个位运算符,它有以下的性质:一个数和自己异或结果为0任何数和0异或结果都是本身不懂的百度因为这个数组是包含两个不同的数假设为a和b,还有若干个出现两次的数。所以我们通过^运算,可以将若干个出现两次的数都排除只留下a和b的异或值s。for(int i:nums)s^=i;//这个s最后就是a^b的结果现在我们拿到了a和b的异或值,下一步就是如何将a和...

2020-04-17 20:42:20 95

原创 LeetCode 剑指offer Q52 两个链表的第一个公共节点

思路这一题虽然是一个简单题,但是题目要求空间复杂度最好为o(1),这就断结了使用set的方法了。浪漫双指针法:假设有headA和headB两个链表,设置两个工作指针A,B,假设他们公共部分长度为c,headA长度为a+c,headB为b+c。那么我们怎样能够在不借助其他空间的情况下且时间复杂度尽量为o(n)。这就要求我们智能进行一次循环便利。我们要找的是位于c的那个公共节点C,那么咋样循环能...

2020-04-17 18:00:15 113

原创 LeetCode 剑指offer Q51数组中的逆序对个数

思路暴力解法很简单但是效率很低,通不过。通过归并排序进行统计逆序的个数。首先归并排序包括划分和合并两个步骤。合并就是将两个已经排好序的子数组进行有序合并。有序合并的代码是一个简单题。就是从头到尾俩俩比较即可。if(left[i]<=right[j]){如果是左边的比右边的小,则为升序,直接放入一个临时数组即可。}else{此时为逆序,left[i]>right[j],则需...

2020-04-11 17:21:43 250

原创 LeetCode 剑指offer Q47礼物的最大值典型dp

思路典型的局部最优组成整体的最优解。贪心dp即可。设dp[i][j]为到达grid[i][j]时的最大礼物值。那么dp[i]的大小便和dp[i-1][j]和dp[i][j-1]相关了。取上和左中较大即可。代码class Solution { public int maxValue(int[][] grid) { int rows=grid.length,cols=gr...

2020-03-25 21:13:50 108

原创 LeetCode 剑指offer Q41 数字序列中某一位的数字

思路这一题考查的是数学知识。首先假设target为我们要找的第n位所在的数字,那我们可以先找到它的位数,设bit=1为位数,count=9为一位需要剪去的数字个数。因为都是从0开始计数,所以可以忽略0位。,例如n=2332,则我们可以先减去[1-9]9个1位数即bitcount,再减去[10-99]90个2位数,然后依次向后减,直到n>bitcount,此时得到的bit就是target的...

2020-03-20 14:36:41 134

原创 LeetCode Q300 最长上升子序列

思路最长上升、最长不下降、最长下降子序列等等类似的题目求子序列长度的题基本都是使用dp来解。还要注意题目中是否指定了是连续子序列还是没有限制,若是连续的子序列就要注意dp代表的含义。还有的题目会使用删除某些数字来获得子序列来反向出题,都一样。本题是非连续的子序列,则dp[i]表示为从[0,i]的最长上升子序列长度。因为是非连续的子序列,所以dp[i]的大小不一定取决于dp[i-1],因为若nu...

2020-03-20 13:15:37 164

原创 LeetCode 剑指offer Q43 1-n中整数中1出现的次数

思路这一题我也懵逼,暴力针对每个数字进行判断肯定是超时的。所以只能找规律了。看了题解的答案。总结一下:首先针对传进来的数字n,求解他的三个参数:他的最高位high是哪个数字pow=Math.pow(10,他的位数-1),这是将n划分成“整数部分“和零碎部分,例如将3423划分为3个1000和423两部分。用pow表示其中的1000就是零碎部分 last=n-highpow要讨论1-n...

2020-03-18 13:48:42 112

原创 LeetCode剑指offer Q42连续子数组的最大和

思路类似于这种可分成子问题的问题,且子问题不相同的情况,一般使用动态规划。本题要求连续的子序列的最大和,那么就想到设dp[i]为以num[i]结尾的连续子序列的最大长度,这样再进行递推公式的推导。因为要求的最大长度且题目中说明数组中有正有负,所以若dp[i-1]小于等于0,则dp[i-1]肯定不会是最大和,那么他的价值则不如直接的num[i]了,所以此时直接将num[i]赋给dp[i]。若dp[...

2020-03-18 13:09:18 109

原创 LeetCode 剑指offer Q40 最小的k个数(大根堆、快排、计数排序法)

package algorithm.jianzhiOffer;public class Q40 { //第一种大根堆 /** * 首先将前k个元素生成一个大根堆,然后对后面的元素进行处理,将堆顶和每个元素进行比较,若比堆顶小,则将其替换给堆顶。然后进行向上进行整理。 * 这样,整理完了之后这个大根堆就存放着前k小个的元素了。 * 关于大根对的建立...

2020-03-14 21:06:52 219

原创 LeetCode 剑指offer Q38字符串的排列

思路求一个字符串的全排列组合,直接想到使用回溯中的全排列算法。回顾一下全排列算法:假设 需要排列 abc。下图表示了整个递归过程。对abc进行全排列就是有三个位置用abc去填,全排列算法使用交换来实现填入操作。如图,第一层递归拿到abc,固定住第一个元素,然后使用循环的方式分别将后面的每个元素和第一个元素进行交换,这样一次层递归便将第一个位置的字母确定了,然后进入在循环中进入下一层递归去确...

2020-03-14 16:20:56 124

原创 LeetCode剑指offer Q37 序列化二叉树 bug解法

思路看到题目给的例子时,我以为在序列化时时将整棵树作为满二叉树来序列化,但是在测试时发现并不是,它只是判断每个节点的左右子树是否为null,如果是则添加为null。但是本题有一些bug,第一个:序列化函数中将最后一层叶子结点的子树也进行了序列化,这种结果官方并不算错,但严格意义上需要将最后的null都消除。bug的原因是这一题测试时是调用的// Codec codec = new Codec(...

2020-03-14 14:09:39 146

原创 LeetCode剑指offer Q36 二叉搜索树与双向链表 java 双百

思路要将一个二叉搜索树转化为升序的循环双向链表,很明显使用中序遍历能获得升序。然后思考怎样改造中序遍历能够构建循环双向链表且不需要新建结点。考虑到双向,则肯定需要保存前驱节点,因此如下设置:新建pre、head两个指针,pre指向前一个工作节点,head指向循环双向链表的头结点。在中序遍历过程中 root.left=pre; pre.right=right; 每次访问一个节点时,为它的前...

2020-03-13 20:29:54 131

原创 LeetCode 剑指offer Q35 复杂链表的复制 两种方式

思路第一个就是通过使用hash,第二个就是通过在原链表的基础上进行修改。代码package algorithm.jianzhiOffer;import java.util.HashMap;import java.util.Map;class Node { int val; Node next; Node random; public Node(in...

2020-03-13 19:07:42 128

原创 LeetCode剑指offerQ34 二叉树中和为某一值的路径

思路经典的dfs题目,设置一个变量用来记录当前路径上的和count,再用一个list(r)用来记录当前的路径。最后只需要在叶子结点时判断是否count==sum,若相等则将r添加进入最后的结果list,注意添加时需要进行深复制操作,否则仅仅是浅复制,不起效果。同时,深复制的方法一般有循环复制。通过ArratList()初始化函数进行复制有些情况下不行。代码/** * Definition ...

2020-03-13 16:20:48 94

原创 LeetCode Q169 、剑指offerQ39 多数元素 三种方式(摩尔投票)

思路本题要求众元素,有三种方式:通过HashMap或者字典等方式,对序列中每个数字进行计数,最后返回出现次数超过n/2的那个数。这种方法复杂度较大,因为涉及到了map的调用。对序列进行排序,排序后,那个出现次数超过一半的元素一定会出现在下标为n/2的位置。使用摩尔投票法 有关摩尔计数法的解读和变化使用,看此链接https://blog.csdn.net/u014248127/artic...

2020-03-13 14:24:13 129

原创 LeetCode剑指offer Q33二叉搜索树的后序遍历

思路判断一个序列是否是某个二叉搜索树的后序遍历结果,主要是要找到一个关键节点,这个节点位于右子树的第一个节点A。在后序遍历的序列中,节点A左边的元素都要小于A,而A右边的节点都要大于A(除了序列的最后一个元素,最后一个元素是此树的根节点)。因此根据此特点,我们可以反过来假设给出的序列就是符合条件的后序遍历结果,我们通过递归的方式不断分割左右子树,并不断判断A是否能合理存在,若不能则false...

2020-03-12 20:33:05 139

原创 LeetCode剑指offer Q32_lll 从上到下打印二叉树lll

思路和前两题一样,都可以使用bfs逐层进行扫描,不过在扫描的时候需要记录此时的层数,若层数为奇数,则不变从左到右添加结果,否则则将此层扫描的结果进行翻转然后加到结果list中去。还是采用层次遍历的方式,比较简单。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * ...

2020-03-12 17:27:34 121

原创 LeetCode 剑指offer Q32_ll从上到下打印二叉树ll

思路采用bfs方式。我采用了bfs的非递归方法。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * }...

2020-03-12 17:01:57 118 1

原创 LeetCode剑指offer Q32——l 从上到下打印二叉树

思路简单的层次遍历即可,使用队列进行层次扫描。但是在此过程中需要用到List 集合,但是函数要求的返回值为int[],因此在转换方式上我使用了两种方式,一种就是forEach 直接一个一个的转,另一种就是使用Arrays的mapToInt映射函数,具体的就是Arrays.stream(原来的list).mapToInt(这里填单个元素转换的class中的转换函数,我这里是Integer::val...

2020-03-12 16:42:19 115

原创 LeetCode 剑指offer Q31栈的压入、弹出序列

思路通过使用一个辅助栈,来模拟pushed数组进入栈中的过程。在将每个pushed元素压入栈时,使用一个while循环判断当前栈顶是否和poped相同,若相同都进行弹出。最后若栈为空则说明正确,否则错误。代码class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { ...

2020-03-11 17:59:17 154

原创 LeetCode Q1013 将数组分成和相等的三部分

思路因为是恋曲切割,分为三个子段。又考虑到子段的和相等,因此直接先算出子段的长度,然后分别从前和后对数组进行循环扫描计数,当前面子段的和等于子段长时推出循环,同理后面子段也如此操作。代码class Solution { public boolean canThreePartsEqualSum(int[] A) { int left=A[0],right=A[A.leng...

2020-03-11 16:01:36 82

原创 LeetCode 剑指offer Q30包含min函数的栈

思路本题要模拟一个栈,实现出入栈,获取栈顶,获取当前最小值等函数。但是,后面来了一个要求,所有函数的时间复杂度要为o(1),push、pop、top函数使用函数都可以实现o(1)的复杂度,但是min函数一般情况下需要进行排序,所以基本是o(n),所以本题的难点在于怎样将min效率提高到o(1)。方法很简单:使用双栈,初始化两个栈s1、s2,s1用来实现一般的出入操作,s2用来存储s1中各个元素...

2020-03-11 00:55:47 172

原创 LeetCode 剑指offerQ29顺时针打印矩阵 java100%

思路通过top、bottom、left、right四个变量来控制矩阵的边界,每次打印完便更新矩阵的边界,边界外的都是已经打印好的。这样,每次打印便可以分解为四个动作:print(m[top][left->right]), top++print(m[top->bottom][right]),right–print(m[bottom][right->left]),botto...

2020-03-10 23:52:12 140

原创 LeetCode 剑指offer Q28对称的二叉树

思路按照题目的要求,即左子树的左孩子和右子树的右孩子进行比较,左子树的右孩子和右子树的左孩子进行比较 。同样的,采用递归的方式,将传入的左右子树进行比较。首先若都为null,则说明到头了,return true。若其中只有一个为null则return false,因为节点的结构都不相同。若做节点的值和右节点的值不相同,也return false。之后,递归调用此函数两次,分别传入left.l...

2020-03-10 22:32:16 113

原创 LeetCode 剑指offer@26树的子结构 java双100%

思路本题其实就是个匹配问题。树的匹配问题,第一步找到第一个匹配点,然后进行逐个匹配,找到第一个匹配点可以采用层次便利或者bfs、dfs等等。本题我首先使用了层次遍历,但是发现结果只超过5%,改成递归形式的dfs之后超过100%。估计是某些特殊的测试用例使用层次遍历会很慢。然后第二步 从该节点开始进行遍历匹配,也是有很多选择,我选择了递归的dfs,并且在每个节点上进行了一些短路操作以减少不必要...

2020-03-10 17:10:46 159

原创 LeetCodeQ543 二叉树直径 java 100%

思路本题要求二叉树的直径,即任意两节点之间的最长路径。一般二叉树问题都需要进行问题的分解,将大问题分解为针对单个节点的子问题。所以,看到针对节点之间的路径问题,一般想到的都是两个叶子结点之间的最大路径,而叶子结点之间的最长路径肯定经过他们最高的祖先节点,且最长路径即两个叶节点到这个祖先节点的路径之和。因此问题转化子问题,求左右两个子树的深度,假设当前节点就是祖先节点,那么以它为根的树的直径就是左...

2020-03-10 14:04:54 98

原创 LeetCode剑指offer Q21 调整数组顺序

这种将数组按照某种规则一分为二的题目基本都可以使用双指针方法。双指针又分为快慢双指针和相向双指针,此题使用两种方式。1.快慢双指针设fast和low两个指针,一前一后向右扫描。low指针用来标示分界点,设定low的左边都是奇数,右边都是偶数。fast是工作指针,在前面,当发现奇数时将对应的元素值和low位置的元素进行交换,然后low++。这样扫描一次便可以将所有的奇数都调到前面。class...

2020-03-07 21:27:11 139

原创 Leetcode剑指offerQ59-||

本题要求均摊复杂度为O(1),看了答案使用的双队列,一个来记录值,一个用来记录最大值(就是排序),但是看了代码,发现在push_back时仍然需要进行类似排序操作的while循环,不能理解均摊o(1).package algorithm.jianzhiOffer;import java.lang.reflect.Method;import java.util.ArrayList;impo...

2020-03-07 18:35:55 133 1

原创 Leetcode 1367 二叉树中列表 java 92ms 超过100%

import java.util.LinkedList;import java.util.Queue;/** * 首先用层次遍历找到第一个匹配点,然后用dfs进行逐个匹配即可 */public class Q1367 { public boolean isSubPath(ListNode head, TreeNode root) { Queue<TreeN...

2020-03-03 11:09:58 183

原创 LeetCode 206 反转链表 头插法

import java.util.Stack;class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}public class Q206 { public ListNode reverseList(ListNode head) { ...

2020-03-02 00:34:51 144

原创 LeetCode 剑指offer 16 数值的整数次方

package jianzhioffer;/** * 复写pow函数,且x在正负100之内,指数也为整数,首先直观的想到第一种方法暴力循环相乘即可,只要注意指数负数的时候变为除法 * * 第二种也是能够想到的递归,这种由类似相同子问题构成的大问题,都可以由递归解决 * 假设求pow(x,n) :1 当n为偶数时,递归关系为pow(x,n)=pow(x,n/2)*pow(x,n/2) ...

2020-03-02 00:01:05 176

空空如也

空空如也

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

TA关注的人

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