![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
木的竹
这个作者很懒,什么都没留下…
展开
-
栈的压入、弹出序列 java
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), pu原创 2021-01-12 20:07:10 · 241 阅读 · 0 评论 -
包含min函数的栈 java 实现
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回 0原创 2021-01-12 17:30:37 · 180 阅读 · 0 评论 -
顺时针打印矩阵 java 详细
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]限制:0 <= matrix.length <= 1000 <= matrix[i].length <= 100leetcode:顺时针打印矩阵解题思路顺时针从外到里打印,每一圈都从该圈的左上角开始。可知每一圈打印都有相似的处理步骤,不同点是新的一圈开始时的坐标不同原创 2021-01-08 20:56:45 · 1037 阅读 · 0 评论 -
对称的二叉树 java 递归
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3示例 1:输入原创 2021-01-08 18:34:21 · 115 阅读 · 0 评论 -
二叉树的镜像递归 java
题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7 / \ / \ 1 3 6 9镜像输出: 4 / \ 7 2 / \ / \ 9 6 3 1LeetCode:二叉树的镜像解题思路对于一棵二叉树而言,每个节点都可以看成一棵以该节点为根节点的二叉树,即具有相同的子结构,可以原创 2021-01-05 13:48:39 · 125 阅读 · 0 评论 -
树的子结构 java
题目描述输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \1 2给定的树 B: 4 / 1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。LeetCode:树的子结构解题思路第一步:在树A中找到和树B的根节点的值一样的节点R(A.val == B.val);进行第二步第二步:判断树A中以R原创 2021-01-04 17:44:53 · 88 阅读 · 0 评论 -
合并两个排序的链表 java
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解题思路由于链表是递增的,所以我们可以先比较两个链表的第一个节点,选择节点值比较小的作为头节点,然后再用同样的思路合并剩余节点,由此可知,可以采用递归进行解答。代码/*** class ListNode {* int val;* ListNode n原创 2021-01-04 16:29:35 · 153 阅读 · 0 评论 -
反转链表 java
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL0 <= 节点个数 <= 5000解题思路设置两个指针,一个指向当前 cur ,一个指向当前的上一个 pre ,当 cur 所指不为 null 时,两个指针在链表上都往后走一步,对应操作为:pre = cur;cur = cur.next;接着原创 2021-01-04 15:40:51 · 127 阅读 · 0 评论 -
链表中环的入口节点(详细分析) java
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。牛客网:链表中环的入口节点解题思路(1)首先需要确定链表中是否包含环,可以用两个快慢指针 fast 和 slow 表示:两个指针同时从链表的头结点出发,fast 一次走两步,slow 一次走一步。如果走得快的指针追上; 走的慢的指针,那么链表就含环(当一个链表含环时,指针已进入该环的节点就一直绕圈圈);如果走的快的指针走到了链表的末尾(fast.next 指向 null)都没有追上走的慢的指针,那么链表就不含环。(2原创 2021-01-04 12:38:51 · 242 阅读 · 0 评论 -
链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第 k 个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。LeetCode:链表中倒数第k个节点示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.解题思路题目要求找出链表中倒数第 k 个节点,也即第 n - k + 1 个节点因为是单项链原创 2021-01-04 10:38:10 · 105 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面 java
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。leetcode:调整数组顺序使奇数位于偶数前面注意:leetcode上所给提示虽然是 1 <= nums.length <= 50000 但是测试用例含有 [] (不讲武德!大意了,没有闪)解题思路使用左右两个指针 pleft .原创 2021-01-03 21:32:18 · 179 阅读 · 0 评论 -
表示数值的字符串 java 实现
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。LeetCode:表示数值的字符串‘.’出现正确情况:只出现一次,且在e的前面‘e’出现正确情况:只出现一次,且出现前有数字‘+’‘-’出现正确情况:只能在开头和e后一位代码中 return numFlag 作用为:因为输入的字原创 2021-01-03 18:49:45 · 214 阅读 · 0 评论 -
正则表达式匹配 java 递归实现
题目描述给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例:输入:s = "aa" p = "a"输出:false解释:"a" 无法匹配 "aa" 整个字符串。提示:0 <= s.length <= 200 <= p.length <= 30s 可能为空,且只包含从 a-z 的小写字母原创 2021-01-03 15:09:03 · 330 阅读 · 0 评论 -
删除链表中重复的节点 java 递归实现
题目描述:在一个排序的链表中,删除重复的节点思路及代码public ListNode deleteDuplication(ListNode head) { // 边界条件 if (head == null || head.next == null) return head; ListNode next = head.next; // 当 head.val 与后续值相等时,继续向后查找,直到找到一个与 head.val 不相等的节点原创 2021-01-02 17:36:51 · 253 阅读 · 0 评论 -
在 O(1) 时间内删除链表节点 java
题目描述:给定单项链表的头指针和一个节点指针,定义一个函数在 O(1) 时间内删除该节点。解题思路因为所给链表为单向链表,题中要求时间复杂度为 O(1) ,注意到题中给出了要删除节点的指针,可以在这方面下文章:我们可以直接将所要删除节点的下一个节点的值赋给删除节点,并将该节点指向下下个节点,再删除下一个节点,从而达到删除给定节点的目的。如果要删除的节点位于链表的尾部,它没有下一个节点,此时需要从链表的头结点开始,顺序遍历到该节点的前一节点,完成删除操作代码/**class ListNode {原创 2021-01-02 16:32:57 · 161 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数(考虑大数问题) java
题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。注:leetcode上该题标记为简单,并未考虑大数情况解题思路n 位数的每一位上都是从 0 到 9 的全排列,我们可以使用递归方法将数字的每一位都从 0 到9 排列一遍,从而得到所有十进制数。递归结束的条件是我们已经设置了数字的最后一位。由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 char 数组进行存储。char 数组索引为 0 对应的数字即为原创 2021-01-02 14:49:18 · 129 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方 java 分治思想
题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。LeetCode:剑指 Offer 16. 数值的整数次方解题思路最直观的解法是将 x 重复乘 n 次,即 x*x*x…*x,时间复杂度为 O(N)。因为乘法是可交换的,所以当 n 为偶数时,可以将上述操作拆开成两半 (x*x…*x) * (x*x…*x),两半的计算是一样的,因此只需要计算一次(当 n 为奇数时只需要再乘一个 x原创 2021-01-02 11:49:04 · 107 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数java 位运算
题目描述请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。注:题目中说的(以二进制串形式)应该是测试代码,我们在解题时只需按照输入一个整数这一要求解题即可LeetCode:剑指 Offer 15. 二进制中1的个数解题思路可以使用位运算:n&(n-1) 位运算可以将 n 的二进制表示中最低的那一位 1 设置为 0。不断将 1 设置为 0,直到 n 为 0。代码原创 2021-01-02 11:02:12 · 66 阅读 · 0 评论 -
剑指 Offer 14. 剪绳子java 动态规划与贪心算法
题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0] * k[1] *...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例 2:输入: 10输出: 36解释: 10 = 3 + 3 +原创 2020-12-20 16:54:53 · 111 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
题目描述地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?leetcode : 剑指 Offer 13. 机器人的运动范围示例 1:输入:m =原创 2020-12-20 15:14:06 · 184 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径 java dfs
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一原创 2020-12-19 19:35:17 · 96 阅读 · 1 评论 -
剑指 Offer 11. 旋转数组的最小数字 java
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。leetcode : 剑指 Offer 11. 旋转数组的最小数字...原创 2020-12-19 15:59:19 · 76 阅读 · 2 评论 -
Partition函数实现java(含分析)
Partition函数作用在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到到数组的右边。Partition还可以用来实现长度为n的数组中查找第k大的数字;以及“数组中超过数字一半的数字”和“最小的k个数”Partition代码int Partition(int data[], int length, int start, int end) { if (data == null || length <= 0 || s原创 2020-12-16 16:51:22 · 1258 阅读 · 1 评论 -
剑指 Offer 10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1提示: 0 <= n <= 100斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示例 2:原创 2020-12-16 13:53:02 · 87 阅读 · 0 评论 -
剑指offer 9 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )leetcode:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"]原创 2020-12-16 11:45:52 · 70 阅读 · 0 评论 -
剑指offer8 二叉树的下一个节点 java实现
解题思路有如下情况: 1.如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; (中序遍历的过程:先遍历树的左子树,再遍历根节点,最后再遍历右子树。所以最左节点是中序遍历的第一个节点。) 2.如果一个节点的右子树不为空,向上找第一个左链接指向的树包含该节点的(祖先节点)。 (如果一个节点没有右子树,且节点是她父节点的左子树,那么他的下一个节点就是他的父节点) (如果一个节点既没有右子树,且他还是他父节点的右子节点,可以沿着指向父节点的指针一直 向上遍历,直到原创 2020-12-16 10:33:13 · 79 阅读 · 0 评论 -
剑指offer 重建二叉树 java实现
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制:0 <= 节点个数 <= 5000leetcode:https://leetcode-cn.com/problems/zhong原创 2020-12-14 16:03:19 · 126 阅读 · 2 评论 -
剑指 Offer 从尾到头打印链表java实现
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000leetcode:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/解题思路从尾到头打印链表,即LIFO,使用栈,最后数组输出,第一次考虑选择ArrayList转为Array时出错,不能转换成功,网上有通过java原创 2020-12-14 10:10:49 · 145 阅读 · 0 评论 -
剑指offer 替换空格java实现
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."限制:0 <= s 的长度 <= 10000leetcode:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/解题思路将String转为BufferString,一个空格要替换成三个字符(%20),所以当遍历到一个空格时,需要在尾部填充两个任意字符。令 p1 指向原创 2020-12-13 16:39:25 · 105 阅读 · 1 评论 -
剑指offer 二维数组中的查找java实现
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回 true原创 2020-12-13 11:20:41 · 106 阅读 · 0 评论 -
剑指offer 数组中重复的数字java实现
解题思路说明:该题在leetcode1.此解决方案是按照剑指offer中的思路写的:数组中的数字都在0~n-1的范围内,如果这个数组中没有重复的数字,那么当数组排序后数字i将出现在下标为i的位置。由于数组中有重复的数字,有些位置可能存在多个数字,同时有些位置可能没有数字。首先 重排数组:从头到尾依次扫描,当扫描到下标为i的数字时,判断这个数字(用m表示)是否等于i,如果不等,将m与下标为m的元素比较,若相等,则m为重复值,返回m,如果不等,将下标i与下标m对应的元素交换(即交换下标i对应的元素值m与下原创 2020-12-13 10:02:54 · 102 阅读 · 0 评论