![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法题
三十六度五
这个作者很懒,什么都没留下…
展开
-
剑指offer刷题--GZ23--二叉搜索树的后续遍历序列
解题思路: 从O(nlogn)到O(n),比递归效率更高的方法:上限约束法 方法一:递归法 看了评论,发现大家普遍使用的是递归分割法,递归简单易懂容易实现,先来一次遍历以确定出左右子树的分界点,然后再分别对两棵子树进行递归判断。现在让我们来分析一下递归方法的时间复杂度: 以标准的完美二叉搜索树为例,递归的每一层都涉及到对序列的遍历,虽然层数越深节点越少(少了子树的根节点),但是这种减少是微不足道的,即使是到了最底层,依旧有n/2的节点(完美二叉树第i层节点数是其上所有节点数之和+1),因此递归方法在每一层.转载 2021-01-28 01:13:33 · 114 阅读 · 0 评论 -
剑指offer刷题--GZ22--从上往下打印二叉树
解题思路: 通过上面的具体例子分析,可以找到规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的尾部。接下来到对队列的头部取出最早进入队列的节点放到ArrayList 中,重复前面的操作,直至队列中所有的节点都存到ArrayList中。 注意: 在Java中Queue是和List、Map同等级别的接口,LinkedList中也实现了Queue接口,该接口中的主要函数有: 容量不够或队列为空时不会抛异常:offer(添加队尾元素)、peek(访问队头元素)、poll(访问队.原创 2021-01-25 00:34:30 · 95 阅读 · 0 评论 -
剑指offer刷题--GZ21--栈的压入,弹出顺序
解题思路: 【思路】借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。 举例: 入栈1,2,3,4,5 出栈4,5,3,2,1 首先1入辅助栈,此时栈顶1≠4,继续入栈2 此时栈顶2≠4,继续入栈3 此时栈顶3≠4,继续入栈4 此时栈顶4=4,出栈4,弹出序.原创 2021-01-24 00:48:05 · 109 阅读 · 0 评论 -
剑指offer刷题--GZ20--包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 解题思路: 看到这个问题, 我们最开始可能会想, 添加一个成员变量用于保存最小元素, 每次压栈时如果压栈元素比当前最小元素更小, 就更新最小元素. 但是这样会有一个问题, 如果最小元素被弹出了呢, 如何获得下一个最小元素呢? 分析到这里可以发现, 仅仅添加一个成员变量存放最小元素是不够的, 我们需要在最小元素弹出后还能得到次小元素, 次小的弹出后, 还要能得到次次小的. 因此, 用另一个栈来保存原创 2021-01-24 00:09:21 · 95 阅读 · 0 评论 -
剑指offer刷题--GZ19--顺时针打印矩阵
解题: import java.util.ArrayList; public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { //判断边界 if(matrix.length == 0){ return new ArrayList<Integer>(0); } //遍历方向--右下左上 .原创 2021-01-21 00:10:32 · 89 阅读 · 0 评论 -
剑指offer刷题--GZ18--二叉树的镜像
解题思路:交换左右子树的节点,然后递归调用该方法。 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public void Mirror(TreeNode root) .原创 2021-01-20 22:53:17 · 89 阅读 · 0 评论 -
剑指offer刷题--GZ17--树的子结构
自己写的: /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root.原创 2021-01-19 00:28:22 · 91 阅读 · 0 评论 -
剑指offer刷题--GZ16--合并两个排序的链表
/* class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { //先定义新链表的头结点 ListNode newListNode = n.原创 2021-01-18 00:16:18 · 96 阅读 · 0 评论 -
剑指offer刷题--GZ15--反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头。 示例1 输入 {1,2,3} 返回值 {3,2,1} public class Solution { public ListNode ReverseList(ListNode head) { if(head==null) return null; //head为当前节点,如果当前节点为空的话,那就什么也不做,直接返回null; ListNode pre = nu原创 2021-01-16 23:59:33 · 99 阅读 · 0 评论 -
剑指offer刷题--GZ14--链表中倒数第k个节点
题目描述 输入一个链表,输出该链表中倒数第k个结点。 示例1 输入 1,{1,2,3,4,5} 返回值 {5} 方法一: /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindKthToTail(ListNode h原创 2021-01-16 23:31:47 · 71 阅读 · 0 评论 -
剑指offer刷题--GZ13--调整数组顺序使得奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 public class Solution { public void reOrderArray(int [] array) { //类似冒泡算法,前偶后奇数就交换: int oddNum = 0;//记录已经摆好位置的奇数的个数 for(int i = 0; i <原创 2021-01-16 22:28:16 · 66 阅读 · 0 评论 -
剑指offer刷题--GZ12--数值的整数次方
题目描述: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 示例1 输入 2,3 返回值 8.00000 暴力解法: public class Solution { public double Power(double base, int exponent) { //暴力解法:时间复杂度o(n),空间复杂度o(1) if(base == 0 &&原创 2021-01-16 00:04:43 · 89 阅读 · 0 评论 -
剑指offer刷题--GZ11--二进制中1的个数
题目描述: 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 示例1: 输入 10 返回值 2 如果不了解左移和右移,那么久先去了解下:https://blog.csdn.net/kaixuansui/article/details/92806813 首先来看一个错误的解法: public class Solution { //从n的2进制形式的最右边开始判断是不是1 /* * 该解法如果输入时负数会陷入死循环,因为负数右移时,在最高位补得是1 *原创 2021-01-15 23:16:16 · 87 阅读 · 0 评论