
剑指Offer
陈粑粑的小白鞋
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指Offer37—序列化二叉树(java版)
题目描述:标签:树 深度优先搜索 广度优先搜索 设计 字符串 二叉树请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; ...原创 2021-09-09 19:28:51 · 221 阅读 · 0 评论 -
剑指Offer36—二叉树搜索树与双向列表(java版)
题目描述:标签:栈 树 深度优先搜索 二叉搜索树 链表 二叉树 双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。代码:思路分析:实际上就是想把一个节点的左子结点指针和右子结点指针改变成前驱结点指针和后继结点指针。1、首先知道一个性质:中序遍历二叉搜索树得到的是递增序列。所以采用中序遍历递归。2、中序遍历具体实现步骤:①首先定义全局变量pre和head用来表示前驱结点和链表的表头。...原创 2021-09-09 17:32:48 · 191 阅读 · 0 评论 -
剑指Offer34—二叉树中和为某一值的路径(java版)
题目描述:标签:树 深度优先搜索 回溯 二叉树输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。代码:思路分析:利用回溯方法1、递归结束条件:当前结点为null,则直接返回;2、将当前结点值添加入path,并将相应的target相应减去当前结点值,做以下两种情况判断:①如果当前traget==0说明路径和满足条件,还要判断当前结点是不是叶子结点,是的话将path添加到ans中;②否则...原创 2021-09-09 09:08:28 · 191 阅读 · 0 评论 -
剑指Offer33—二叉搜索树的后序遍历序列(java版)
题目描述:标签:栈 树 二叉搜索树 递归 二叉树 单调栈输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。代码:思路分析:1、后序遍历是“左-右-中”的顺序,二叉搜索树的定义:根节点的值大于它左子树的所有值,小于它右子树的所有值。2、所以后序遍历数组的最后一个值是根节点,通过循环遍历,找到左右子树的分界下标,分界下标以前的所有数都小于根节点的值,分解下标以后的所有数都大...原创 2021-09-08 22:25:33 · 232 阅读 · 0 评论 -
剑指Offer32-Ⅲ—从上到下打印二叉树Ⅲ(java版)
题目描述:标签:树 广度优先搜索 二叉树请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。代码:思路分析:层序遍历,不过在每一组添加数据的时候做了层数不同时添加方式不同的判断/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode ...原创 2021-09-08 22:10:37 · 177 阅读 · 0 评论 -
剑指Offer32-Ⅱ—从上到下打印二叉树Ⅱ(java版)
题目描述:标签:树 广度优先搜索 二叉树从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。代码:思路分析:层序遍历的思想,不过需要每层添加一次。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) ...原创 2021-09-08 14:52:29 · 139 阅读 · 0 评论 -
剑指Offer32-Ⅰ—从上到下打印二叉树(java版)
题目描述:标签:树 广度优先搜索 二叉树从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。代码:思路分析:层序遍历的思想1、首先最重要的是使用队列+广度优先搜索来实现层序遍历操作。2、把根节点加入队列,对应此时的层数。以此时队列的长度为循环终止条件开始循环:取队列节点的值加入当层的list,并把该节点的左右节点加入队列。其实每层即对应一次大循环此时队列里的节点个数。/** * Definition for a binary tree node....原创 2021-09-08 11:59:05 · 160 阅读 · 0 评论 -
剑指Offer26—树的子结构(java版)
题目描述:标签:树 深度优先搜索 二叉树输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。代码:思路分析:1、先序遍历二叉树A,即体现在isSubStructure的return写法上,先用二叉树A的根节点和二叉树B作对比,调用isSubTree方法,再用A.left和B对比,最后用A.right和B对比,即是一个"中-左-右"的先序遍历顺序。2、对比是否是子树的方法isSubTre...原创 2021-09-08 11:28:36 · 252 阅读 · 0 评论 -
剑指OfferJZ57—二叉树的下一个结点(java版)
题目描述:(来源:牛客网)标签:二叉树给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。代码:思路分析:1、假如当前结点有右子树,则它的下一个结点是右子树最左边的结点2、假如当前结点没有右子树,则它的下一个结点可能是它的父节点①如果父节点.left=当前结点,则返回父节点②如果不等,说明是它的右儿子得到的父节点,则一直回溯到根节点,返回null/*public clas.原创 2021-09-06 10:04:04 · 120 阅读 · 0 评论 -
剑指Offer52—两个链表的第一个公共节点(java版)
题目描述:标签:哈希表 链表 双指针输入两个链表,找出它们的第一个公共节点。注意:如果两个链表没有交点,返回 null.在返回结果后,两个链表仍须保持原有的结构。可假定整个链表结构中没有循环。程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。代码:思路分析:设A的长度为a+c,B的长度为b+c,其中c为尾部公共部分的长度,可知a+c+b=b+c+a。① 当访问链表A的指针访问到链表尾部时,令它从链表B的头部重新开始访问链表B;② 当访问链...原创 2021-09-05 17:22:41 · 151 阅读 · 0 评论 -
剑指Offer35—复杂链表的复制(java版)
题目描述:标签:哈希表 链表请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。代码:思路分析:分三步走:① 复制节点,并连接到每个对应的节点后面② 建立random连接③ 拆分/*// Definition for a Node.class Node { int val; Node next; ..原创 2021-09-05 17:03:18 · 137 阅读 · 0 评论 -
剑指Offer25—合并两个排序的链表(java版)
题目描述:标签:递归 链表输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。代码:思路分析:递归1、递归结束条件,如果l1链表到尾部了,直接返回l2;如果l2链表到尾部了,直接返回l1。2、如果l1.val <= l2.val,则递归找到l1的下一个连接在哪里,递归结束返回l13、如果l1.val > l2.val,则递归找到l2的下一个连接在哪里,递归结束返回l2/** * Definition for singly-li..原创 2021-09-05 16:45:48 · 127 阅读 · 0 评论 -
剑指Offer22—链表中倒数第k个节点(java版)
题目描述:标签:链表 双指针输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。代码:思路分析:先循环一遍统计链表中的结点个数,然后在循环遍历到N-k的位置,返回该位置上的结点。/** * Definition for singly-linked list. * pub..原创 2021-09-05 16:07:11 · 159 阅读 · 0 评论 -
剑指Offer82—删除排序链表中的重复元素Ⅱ(java版)
题目描述:标签:链表 双指针存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。返回同样按升序排列的结果链表。代码:思路分析:递归1、递归结束调节,如果head == null 或者 head.next == null,说明没有结点或者只有一个结点,直接返回head即可2、定义一个next结点next=head.next,两种情况不同处理:①如果head.val != next...原创 2021-09-05 15:47:48 · 229 阅读 · 0 评论 -
剑指Offer18—删除链表的结点(java版)
题目描述:标签:链表给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。说明:题目保证链表中节点的值互不相同 若使用 C 或 C++ 语言,你不需要free或delete被删除的节点代码:思路分析:掌握以下删除链表的表达式cur.next = cur.next.next/** * Definition for singly-linked list. * public class ListNode { *...原创 2021-09-05 15:24:52 · 112 阅读 · 0 评论 -
剑指Offer06—从尾到头打印链表(java版)
题目描述:标签:栈 递归 链表 双指针输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。代码:思路分析:定义一个栈(利用先入后出的特性),用来存放链表节点,然后在pop出来存储结果数组中,就能从尾到头输出节点了/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNod...原创 2021-09-05 15:16:14 · 126 阅读 · 0 评论 -
剑指Offer58-Ⅱ—左旋转字符串(java版)
题目描述:标签:数学 双指针 字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。代码:思路分析:以n为界限将字符串分为两部分,先将两部分分别翻转,最后再对整个字符串进行翻转。class Solution { public String reverseLeftWords(String s, int n) {...原创 2021-09-05 15:06:19 · 202 阅读 · 0 评论 -
剑指Offer58-Ⅰ—翻转单词顺序(java版)
题目描述:标签:双指针 字符串输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。说明:无空格字符构成一个单词。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。代码:思路分析:这题和LeetCode151题翻转字符串里的单词相似。1、..原创 2021-09-05 14:53:10 · 301 阅读 · 0 评论 -
剑指Offer57-Ⅱ—和为s的连续正数序列(java版)
题目描述:标签:数学 双指针 枚举输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。代码:思路分析:1、定义开始指针strat、结束指针end、以及当前和curSum2、三种情况:①curSum > target,说明需要curSum -= start;且start++②curSum < target,说明需要end++,并且curSum +=...原创 2021-09-04 22:21:36 · 164 阅读 · 0 评论 -
剑指Offer57—和为s的两个数字(java版)
题目描述:标签:数组 双指针 二分查找输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。代码:思路分析:1、因为数组有序,所以定义双指针left,right分别指向数组头和尾2、处理以下三种情况:①nums[left] + nums[right] = target,返回即可②nums[left] + nums[right] <target,left++③nums[left] + ...原创 2021-09-04 22:03:21 · 102 阅读 · 0 评论 -
剑指Offer59-Ⅰ—滑动窗口的最大值(java版)
题目描述:标签:队列 滑动窗口 单调队列 堆(优先队列)给定一个数组nums和滑动窗口的大小k,请找出所有滑动窗口里的最大值。代码:思路分析:维护一个大小为k的大顶堆,每次将大顶堆的堆顶加入到list中,这里要注意的是想要移除队列中的某个元素只要使用queue.remove(该元素的值)即可。class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(k ...原创 2021-09-04 21:54:46 · 150 阅读 · 0 评论 -
剑指Offer41—数据流中的中位数(java版)
题目描述:标签:设计 双指针 数据流 排序 堆(优先队列)如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4]的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double f...原创 2021-09-04 21:28:31 · 172 阅读 · 0 评论 -
剑指Offer40—最小的k个数(java版)
题目描述:标签:数组 分治 快速选择 排序 堆(优先队列)输入整数数组arr,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。代码:《方法一:快速排序》思路分析:利用快排思想,找到第k-1个位置的下标,然后利用Arrays.copyOf(arr, index+1)用来返回(0~index)的元素。import java.util.Random;class Solution { pr...原创 2021-09-04 17:41:38 · 180 阅读 · 0 评论 -
剑指Offer31—栈的压入、弹出序列(java版)
题目描述:标签:栈 数组 模拟输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。代码:思路分析:1、用一个栈保存数组,并用一个指针指向poped数组开头,每次push操作后,判断当前栈顶元素是否和poped[j]相同,相同则pop且j++,...原创 2021-09-03 15:07:36 · 107 阅读 · 0 评论 -
剑指Offer30—包含min函数的栈(java版)
题目描述:标签:栈 设计设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop()—— 删除栈顶的元素。top()—— 获取栈顶元素。getMin() —— 检索栈中的最小元素。代码:思路分析:1、定义两个栈,一个dataStack用来正常存储数据,另一个minStack用来存储每一次push操作当前栈内最小的元素;2、push操作,dataStack正常push,minSta...原创 2021-09-03 14:51:03 · 267 阅读 · 0 评论 -
剑指Offer09—用两个栈实现队列(java版)
题目描述:标签:栈 设计 队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )代码:思路分析:思路同leetcode232。class CQueue { Deque<Integer> inStack; Deque<Integer> outStack; ...原创 2021-09-03 14:31:26 · 151 阅读 · 0 评论 -
剑指Offer50—第一个只出现一次的字符(java版)
题目描述:标签:队列 哈希表 字符串 计数在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。代码:思路分析:先用hashmap统计每个字符的个数,然后再循环一次,找到只出现1次的第一个字符。class Solution { public char firstUniqChar(String s) { Map<Character, Integer> map = new HashMap<&...原创 2021-09-03 12:10:07 · 197 阅读 · 0 评论 -
剑指Offer29—顺时针打印矩阵(java版)
题目描述:标签:数组 矩阵 模拟输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。代码:思路分析:思路同leetcode59螺旋矩阵。class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix == null || matrix.length == 0 || matrix[0].length == 0){ return new i...原创 2021-09-03 11:58:12 · 109 阅读 · 0 评论 -
剑指Offer04—二维数组中的查找(java版)
题目描述:标签:数组 二分查找 分治 矩阵在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。代码:思路分析:线性查找1、利用二维数组的特点,从右上角开始查找,它左边的元素都小于当前元素,它下边的元素都大于当前元素;2、令row=0,col=m-1,从右上角开始查找,如果matrix[row][col]==target,则返回true;如...原创 2021-09-03 11:05:45 · 227 阅读 · 0 评论 -
剑指Offer03—数组中重复的数字(java版)
题目描述:标签:数组 哈希表 排序找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。代码:思路分析:用set的不重复性,每次利用set保存数字前。先用contains()方法判断是否存在该数,如果存在则输出该数(说明该数重复)class Solution { public int findRepea...原创 2021-09-02 20:00:55 · 88 阅读 · 0 评论