![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文章平均质量分 72
PMPWDF
这个作者很懒,什么都没留下…
展开
-
正则表达式匹配
题目:力扣解题思路:做这道题运用的递归的思路。我们从左到右进行匹配,若当前匹配成功地话,则最后的结果取决于后面是否也能匹配成功。若当前匹配失败的话,则直接返回失败。我们从左到右对s的字符一个一个进行匹配。首先,考虑特殊情形:s.length() p.length() 结果 0 0 true 0 !0 不确定 !0 0 false !0 !0 不确定 ...原创 2020-11-11 22:00:55 · 324 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
题目:力扣解题思路:暴力的方法:我没有尝试,思路也比较简单,循环指数次,就不赘述了。快速幂:基本思路:base*base = base^2, base^2*base^2 = base^4,...., base^(e/2)*base^(e/2) = base^e。可以将时间复杂度降低至O(lge)。我一开始长尝试使用递归来求解,发现在测试用例是1.00000001 999999997的时候,有错误,但是差距不是很大,但思路没有问题,其实没有注意递归返回的精度的问题。在做这道题的时.原创 2020-11-09 20:57:50 · 172 阅读 · 0 评论 -
华为9.9第三题
import java.util.HashMap;import java.util.Scanner;public class Main { static int result = 0; public static class TreeNode{ int id; int value; int left_id; int right_id; TreeNode left; TreeNode rig.原创 2020-09-14 23:25:55 · 226 阅读 · 0 评论 -
分割数组的最大值
题目:力扣解题思路:动态规划和二分查找具体可看https://leetcode-cn.com/problems/split-array-largest-sum/solution/fen-ge-shu-zu-de-zui-da-zhi-by-leetcode-solution/关于二分法,cnt为什么初始化为1?这里cnt初始化为1, 是因为循环中当cnt+1的时候,首先预示着已经填满了一个子组,其次还预示着下一组已经有一个数字加入了(即total=num),所以最后一组在循环中一定不..转载 2020-07-25 14:42:54 · 139 阅读 · 0 评论 -
数独
题目:牛客网解题思路:看注释public class Solution { public void solveSudoku(char[][] board) { //深度搜索 dfs(board, 0); } private boolean dfs(char[][] board, int step) { // ...原创 2020-02-16 18:37:42 · 165 阅读 · 0 评论 -
set-matrix-zeroes
题目:牛客网解题思路:创建两个集合,分别保存要重置为0的行与列遍历matrix,如果找到某数为0,将所在行与列存储到集合中将集合中保存的行数与列数分别遍历出来,分别将整行与整列置0import java.util.HashSet;public class Solution { public void setZeroes(int[][] matrix) { ...原创 2020-02-15 19:48:43 · 100 阅读 · 0 评论 -
word-search
题目:牛客网解题思路:对于要找的word,首先要在board中找到符合的首字母,可能没有,也可能有多个,对于每个可能成为首字母的字符进行DFS(递归),这里用了两重for循环,对每个字符都进行了是否是首字母的比较。DFS:注意的点:isvisited数组用于标记已经判断过的符合的字符,因为同一个字符不能用2次,当确定某字符符合条件时,将其对应位置的isvisited记为true,...原创 2020-02-15 19:31:26 · 237 阅读 · 0 评论 -
N皇后问题
题目:牛客网解题思路:参考:链接由于需要在n*n的棋盘格中放入n个皇后,就必须每一行放一个否则就会出现一行有两个皇后的情况,会发生冲突。那么就可以递归的解决每一行问题最核心的问题是:如何能快速判断不合法的情况,即快速剪枝同行或同列的冲突可以简单用一个数组来考虑,难点是两条对角线对角线条数2*n-1左对角线:坐标x+y是一个唯一定值 x+y ...转载 2020-02-14 20:40:28 · 165 阅读 · 0 评论 -
path-sum-ii
题目:牛客网解题思路:只有当节点为叶子节点且root到leaf的和等于sum才是符合题意得路径即加入res的条件一定是node.left==null && node.right==null && node.val == sum-(root到node的父节点的和)使用递归import java.util.ArrayList;/** * D...原创 2020-02-13 18:34:25 · 126 阅读 · 0 评论 -
populating-next-right-pointers-in-each-node
题目:牛客网解题思路:利用层序遍历import java.util.LinkedList;import java.util.Queue;/** * Definition for binary tree with next pointer. * public class TreeLinkNode { * int val; * TreeLinkNod...原创 2020-02-12 19:22:44 · 104 阅读 · 0 评论 -
树由底层到顶层的层序遍历及之字形层序遍历
题目:牛客网解题思路:使用队列进行遍历,栈来递归import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;/** * Definition for binary tree * public class TreeNode { ...原创 2020-02-12 18:20:43 · 311 阅读 · 0 评论 -
binary-tree-maximum-path-sum
题目:牛客网解题思路:(转载自:<a href="http://blog.csdn.net/linhuanmars/article/details/22969069" target="_blank">http://blog.csdn.net/linhuanmars/article/details/22969069)*这道题是求树的路径和的题目,不过和平常不同的是这里的...转载 2020-02-11 20:12:06 · 112 阅读 · 0 评论 -
sum-root-to-leaf-numbers
题目:牛客网解题思路:递归若当前结点无左右子树,则返回当前节点的值;若当前结点有左右子树,则改变其左右子树的value值,将当前结点的value值乘10加到其左右子树的value值上,返回fun(left)+fun(right);若当前节点只有左子树或只有右子树,则改变其左或右子树的value值,将当前结点的value值乘10加到其左或右子树的value值上,返回fun(le...原创 2020-02-11 19:25:48 · 129 阅读 · 0 评论 -
由前序遍历和中序遍历的到二叉树
题目:牛客网/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution ...原创 2020-02-10 18:37:07 · 241 阅读 · 0 评论 -
由中序遍历和后序遍历得到二叉树
题目:牛客网解题思路:不需要辅助函数,简单易懂后序遍历容器的最后一个数是根节点,中序遍历的根节点左边是左子树,右边是右子树,后序遍历左子树节点值相邻,右子树节点值也相邻。由后序遍历最后一个值将中序遍历分成左右两部分,再由这两部分的size将后序遍历分成左右两部分,递归即可/** * Definition for binary tree * public class...转载 2020-02-10 18:14:45 · 690 阅读 · 0 评论 -
后序遍历
题目:牛客网解题思路:链接:https://www.nowcoder.com/questionTerminal/32af374b322342b68460e6fd2641dd1b?f=discussion来源:牛客网要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在孩子,但是其孩子都已被访问过...原创 2020-02-10 13:58:24 · 128 阅读 · 0 评论 -
二叉树中序遍历,非递归与递归
题目:牛客网解题思路:非递归借用栈非递归:import java.util.ArrayList;import java.util.Stack;/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeN...原创 2020-02-10 13:11:24 · 175 阅读 · 0 评论 -
triangle
题目:牛客网解题思路:链接:https://www.nowcoder.com/questionTerminal/2b7995aa4f7949d99674d975489cb7da?f=discussion来源:牛客网注意观察前后2行的位置关系 triangle[i][j]=min(triangle[i+1][j], triangle[i+1][j+1])+triangle[i][j...原创 2020-01-23 15:07:03 · 175 阅读 · 0 评论 -
字符串的排列
题目:牛客网解题思路:链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7?f=discussion来源:牛客网递归法,问题转换为先固定第一个字符,求剩余字符的排列;求剩余字符排列时跟原问题一样。(1) 遍历出所有可能出现在第一个位置的字符(即:依次将第一个字符同后面所有...原创 2020-01-22 21:59:31 · 118 阅读 · 0 评论 -
climbing-stairs
题目:牛客网解题思路:因为一次只能走1步或2步,所以n个阶梯的最后一步肯定是1步或2步,因此f(n)=f(n-1)+f(n-2),一开始尝试用递归的方法,但是超时,之后采用一个数组来存储f(1),f(2)....f(n),是一个斐波那契数列,这样就避免了重复的计算。递归法:(超时)public static int climbStairs(int n) { ...原创 2020-01-22 20:54:50 · 160 阅读 · 0 评论 -
判断是否是二叉搜索树
二叉查找树二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树解题思路:利用中序遍历,如果是二叉搜索树,其中序遍历的结果一定是升序的...原创 2020-01-20 20:15:50 · 770 阅读 · 0 评论 -
二叉树中序遍历
import java.util.List;import java.util.ArrayList;import java.util.Stack;/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode r...原创 2020-01-20 19:44:10 · 336 阅读 · 0 评论 -
二叉树层序遍历
题目描述:给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)例如:给定的二叉树是{3,9,20,#,#,15,7}, 3 / 9 20 / 15 7该二叉树层序遍历的结果是[ [3], [9,20],[15,7]]解题思路:使用队列,这个题与普通的层序遍历稍有不同,最后返回的结果是list的集合,每一个list是一层的遍...原创 2020-01-20 17:51:23 · 655 阅读 · 0 评论 -
二叉树是否是平衡的
题目描述:判断给定的二叉树是否是平衡的在这个问题中,定义平衡二叉树为每个节点的左右两个子树高度差的绝对值不超过1的二叉树平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。解题思路:主要方法是递归,平衡二叉树不仅左右两个子树的深度差不大于1,其左右子树也都是平衡二叉树。判断以当前节点为根节点的树,其左右子树的深度差...原创 2020-01-19 17:23:46 · 362 阅读 · 0 评论 -
二叉树前序遍历(递归及非递归)
非递归需要利用栈一开始将root入栈;循环结束条件:栈空;每次循环,先使栈顶元素出栈,将其数值加入list中,再将其右结点入栈,左结点入栈,因为前序遍历是先根再左后右,入栈顺序要先右后左;import java.util.ArrayList;import java.util.Stack;/** * Definition for binary tree * publ...原创 2020-01-19 15:33:58 · 171 阅读 · 0 评论 -
二叉树的最小深度
题目描述:求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。解题思路:递归与求最大深度稍有不同,需要考虑左子树为空或右子树为空的情况。/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; *...原创 2020-01-18 16:22:30 · 111 阅读 · 0 评论 -
maximum-depth-of-binary-tree二叉树的最大深度
题目描述:求给定二叉树的最大深度,最大深度是指树的根结点到最远叶子结点的最长路径上结点的数量。解题思路:递归,递归是二叉树常用的方法。/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode ri...原创 2020-01-18 16:12:45 · 130 阅读 · 0 评论 -
reorder-list反转链表
题目描述:将给定的单链表L:L0→L1→…→Ln-1→Ln,重新排序为:L0→Ln→L1→Ln-1→L2→Ln-2→…要求使用原地算法,并且不改变节点的值例如:对于给定的单链表{1,2,3,4},将其重新排序为{1,4,2,3}.解题思路:1、把链表分成两部分,如1->2->3->4->5->null,分成l...原创 2020-01-18 16:12:53 · 177 阅读 · 0 评论 -
合并链表
题目描述:将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的。public class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1 == null) return l2; if(l2 ==...原创 2020-01-17 18:53:39 · 100 阅读 · 0 评论 -
reverse-linked-list-ii反转链表
题目描述:将一个链表m位置到n位置之间的区间反转,要求使用原地算法,并且在一次扫描之内完成反转。例如:给出的链表为1->2->3->4->5->NULL,m= 2 ,n= 4,返回1->4->3->2->5->NULL.注意:给出的m,n满足以下条件:1 ≤m≤n≤ 链表长度解题思路:...原创 2020-01-17 18:47:53 · 147 阅读 · 0 评论 -
判断链表有没有环
题目描述:判断给定的链表中是否有环扩展:你能给出不利用额外空间的解法么?有环的链表:首先要清楚有环的链表长啥样,看图一,有环的链表有什么特点呢?从head开始遍历,最终会进入环中,在环里循环遍历,并不会出现null。思路:1、不考虑额外空间问题,即可以运用其他的结构来解决问题。可以使用哈希表,每遍历一个node在hashmap中寻找有没有存在该n...原创 2020-01-17 16:08:09 · 150 阅读 · 0 评论 -
MergeList
#include<iostream>#include<malloc.h>using namespace std;int* MergeList(int a[],int alen,int b[],int blen){ int* t=(int*)malloc(sizeof(int)*(alen+blen)); int* flag=t; int* r=...原创 2018-05-13 16:20:53 · 2867 阅读 · 0 评论 -
有序矩阵中第K小的元素
题目:力扣解题思路:先变成一维数组,再利用快速排序,找到第K小的。没有利用原二维数组有序的特性。时间复杂度为,空间复杂度其实这道题当时一看就考虑能不能用二分查找,因为它从左上到右下是有序的,但想了一会还是没想到解决方案,后面看了题解,是利用一条分割线,具体可以看题解class Solution { public int kthSmallest(int[][] matrix, int k) { int row = matrix.length; in.原创 2020-07-02 15:29:41 · 128 阅读 · 0 评论 -
minimum-window-substring
题目:链接解题思路:链接:https://www.nowcoder.com/questionTerminal/c466d480d20c4c7c9d322d12ca7955ac来源:牛客网主要思路是通过两次遍历找到所有可能的窗口(即从S中从start到end包含一个T),通过以下几个步骤实现:为了减少时间复杂度,用map记录T中所有字符出现的次数,使用count在S中寻找时计数,一旦找到...转载 2020-02-08 20:14:32 · 130 阅读 · 0 评论 -
maximal-rectangle
题目:牛客网解题思路:利用递增栈,可参考https://blog.csdn.net/qq_17550379/article/details/85093224这种解法显然很慢,我们有一种更好的思路就是通过递增栈。所谓的递增栈,就是栈中只存放递增序列。我们首先将2加入到栈中,我们接着访问1,我们发现1比栈顶元素2小,所以我们将栈顶元素2弹出,并且记录此时的面积2。我们发现栈已经...转载 2020-02-07 19:13:20 · 227 阅读 · 0 评论 -
字符串最后一个单词的长度
题目:牛客网import java.util.Scanner;public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); while(in.hasNext())...原创 2020-02-05 19:21:07 · 154 阅读 · 0 评论 -
字符串中找出连续最长的数字串
题目:牛客网解题思路:遍历字符串,对每一个字符判断是否为数字如果是数字则更新记录长度加一,记录其位置,与最大长度作比较取大的长度如果不是数字则记录长度更新为0import java.util.Scanner;public class Main { public static void main(String[] args) { // TODO Auto-gen...原创 2020-02-04 19:40:24 · 138 阅读 · 0 评论 -
查找第K大的元素
题目:牛客网解题思路:先排序,在输出第三大的数值。使用了快排package offer;import java.util.ArrayList;import java.util.Arrays;import java.util.Scanner;public class Main { public static int quickSort(int[] data, ...原创 2020-02-03 19:40:12 · 186 阅读 · 0 评论 -
二维数组中的查找
题目:牛客网解题思路:利用二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较,当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col--;当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;publ...原创 2020-02-03 19:18:40 · 157 阅读 · 0 评论 -
大整数排序
题目:牛客网解题思路:大数位数最多的数值最大,若位数相同则从第一位开始比较,相同位的数字大的数值大。与成绩排序相似,对Comparator做相应的修改即可。1、大数无法直接比较,需要用String来表示2、将大数放到一个list中3、使用Collections对list进行排序,Comparator:用位数即string的长度作为排序的依据import java....原创 2020-02-02 20:33:17 · 265 阅读 · 0 评论