剑指offer之16-20题解
剑指offer之16-20题解
目录
- 合并两个排序的链表
- 树的子结构
- 二叉树的镜像
- 顺时针打印矩阵
- 包含min函数的栈
16. 合并两个排序的链表
(一)题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(二)思路
递归:如果
list1.val<=list2.val
,则list1位置不变,它的下一位从list1.next
和list2
中选出。递归。否则list2的位置不变,它的下一位从list1
和list2.next
中选出。递归。迭代:跟归并排序一样,当两个链表不为null时,谁小谁依次加入head节点。最后会有list1或者list2剩余节点没有加入,遍历加入即可。
(三)代码实现
- 递归代码实现
public class Solution {public ListNode Merge(ListNode list1,ListNode list2) {if (list1==null){return list2;}if (list2==null){return list1;}if (list1.val<=list2.val){list1.next = Merge(list1.next,list2);return list1;}else {list2.next = Merge(list1,list2.next);return list2;}}
}
- 迭代代码实现
public class Solution {public ListNode Merge(ListNode list1, ListNode list2) {ListNode head = new ListNode(-1);ListNode cur = head;while (list1 != null && list2 != null) {if (list1.val <= list2.val) {cur.next = list1;list1 = list1.next;} else {cur.next = list2;list2 = list2.next;}cur = cur.next;}if (list1 != null) {cur.next = list1;}if (list2 != null) {cur.next = list2;}return head.next;}
}
17. 树的子结构
(一)题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
(二)思路
- isSubtreeWithRoot()方法:
- 判断节点A和B是否相同,如果不同返回false。
- 如果相同继续递归A的左孩子和B的左孩子,A的右孩子和B的右孩子看是否相同。
- 当root2==null时,说明比较完毕,返回true;
- 当root1==null时,说明遍历完A都没有找到一样的,返回false;
(三)代码实现
public class Solution {public boolean HasSubtree(TreeNode root1, TreeNode root2) {if (root1 == null || root2 == null)return false;return isSubtreeRoot(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);}private boolean isSubtreeRoot(TreeNode root1, TreeNode root2) {if (root2 == null)return true;if (root1 == null)return false;if (root1.val != root2.val)return false;return isSubtreeRoot(root1.left, root2.left) && isSubtreeRoot(root1.right, root2.right);}
}
18. 二叉树的镜像
(一)题目描述
(二)思路
- 交换左右节点,然后依次递归下去。
(三)代码实现
public class Solution {public void Mirror(TreeNode root) {if (root == null)return;swap(root);Mirror(root.left);Mirror(root.right);}private void swap(TreeNode root) {TreeNode t = root.left;root.left = root.right;root.right = t;}
}
19. 顺时针打印矩阵
(一)题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
(二)思路
- 找到左上角和右下角,打印一圈,然后左上角++,右下角–,再次打印一圈,依次类推
(三)代码实现
- 大佬代码
import java.util.ArrayList;
public class Solution {public ArrayList<Integer> printMatrix(int[][] matrix) {ArrayList<Integer> ret = new ArrayList<>();int r1 = 0, r2 = matrix.length - 1, c1 = 0, c2 = matrix[0].length - 1;while (r1 <= r2 && c1 <= c2) {for (int i = c1; i <= c2; i++) {ret.add(matrix[r1][i]);}for (int i = r1 + 1; i <= r2; i++) {ret.add(matrix[i][c2]);}if (r1 != r2) {for (int i = c2 - 1; i >= c1; i--) {ret.add(matrix[r2][i]);}}if (c1 != c2) {for (int i = r2 - 1; i > r1; i--) {ret.add(matrix[i][c1]);}}r1++;r2--;c1++;c2--;}return ret;}
}
- 比较好理解的代码,不过长了一点
import java.util.ArrayList;
public class Solution {public ArrayList<Integer> printMatrix(int[][] matrix) {int ar = 0, ac = 0, br = matrix.length - 1, bc = matrix[0].length - 1;ArrayList<Integer> list = new ArrayList<>();while (ar <= br && ac <= bc) {ArrayList<Integer> list1 = printRound(matrix, ar++, ac++, br--, bc--);for (int i = 0; i < list1.size(); i++) {list.add(list1.get(i));}}return list;}private ArrayList<Integer> printRound(int[][] matrix, int ar, int ac, int br, int bc) {ArrayList<Integer> list = new ArrayList<Integer>();if (ar == br) {for (int i = ac; i <= bc; i++) {list.add(matrix[ar][i]);}} else if (ac == bc) {for (int i = ar; i <= br; i++) {list.add(matrix[i][ac]);}} else {int curr = ar;int curc = ac;while (curc != bc) {list.add(matrix[ar][curc]);curc++;}while (curr != br) {list.add(matrix[curr][bc]);curr++;}while (curc != ac) {list.add(matrix[br][curc]);curc--;}while (ar != curr) {list.add(matrix[curr][ac]);curr--;}}return list;}
}
20. 包含min函数的栈
(一)题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
(二)思路
生成两个栈,一个存放进入的数据元素dataStack,一个存放最小值minStack。
- push操作:dataStack直接入栈,minStack如果为null,直接入栈,不为nullpeek出栈顶元素和入栈的元素比较,谁小谁入栈。
- pop操作:两个栈直接pop。
- top操作:返回dataStack.peek().
- min操作:peek出minStack栈顶元素
(三)代码实现
import java.util.Stack;public class Solution {private Stack<Integer> dataStack = new Stack<>();private Stack<Integer> minStack = new Stack<>();public void push(int node) {dataStack.push(node);minStack.push(minStack.isEmpty() ? node : Math.min(minStack.peek(), node));}public void pop() {dataStack.pop();minStack.pop();}public int top() {return dataStack.peek();}public int min() {return minStack.peek();}
}
剑指offer之16-20题解相关推荐
- 剑指offer——面试题20:顺时针打印矩阵
剑指offer--面试题20:顺时针打印矩阵 Solution1: 可参考leetCode 54题的解法 书上的思路特别好,学习之~ class Solution { public:vector< ...
- 【剑指offer】java版题解(持续更新)
本文为刷[剑指]备战校招的过程,持续更新 备战虽晚但卷,共勉! 目录,按刷题时间排序 斐波那契数列 用两个栈实现队列 二维数组中的查找 包含min函数的栈 从尾到头打印链表 反转链表 复杂链表的复制 ...
- 剑指offer 面试16题
面试16题: 题目:数值的整数次方 题:实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题 ...
- java 打印_剑指Offer面试题20(Java版):顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵: 1,2,3,4 5,6,7,8 9,10,11,12 13,14,15,16 则依次打印出数字1,2,3, ...
- 剑指offer面试题[20]-顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...
- 【剑指Offer】16重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- C++剑指offer刷题笔记
说明:本文是本人刷题后整理的剑指offer1-68题的题解笔记,编程语言为c++. 主要参考刷题笔记网址:leetcode剑指offer 次要参考刷题笔记网址:牛客剑指offer 剑指OFFER 面试 ...
- 剑指offer第二版答案详细版(带详细解题思路)
1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...
- 《剑指 Offer》题目汇总
文章目录 1. 数组 2. 链表 3. 栈和队列 4. 哈希表 5. 字符串 6. 树 7. 堆 8. 回溯和深度优先搜索 9. 递归和循环 10. 双指针 11. 动态规划 12. 贪心算法 13. ...
- JS版剑指offer
JS版剑指offer JS刷题总结 牛客网 递归算法的时间复杂度:递归的总次数*每次递归的数量. 递归算法的空间复杂度:递归的深度*每次递归创建变量的个数. 二叉树(12道): 剑指Offer(4): ...
最新文章
- JShell:Java REPL综合指南
- ASP.NET如何给控件增加属性?
- Python:__slots__()方法和@property方法
- (转)JAVA AJAX教程第三章—AJAX详细讲解
- QM课程02-外部功能
- k8s 手动恢复redis 集群_二进制手动部署k8s-1.14高可用集群(二、集群部署)
- redis nosql_NoSql数据库:Cassandra,Mongo,Redis数据库比较
- 使用Lucene的搜索服务器搜索Jira问题
- Java 答疑:编译器和解释器有何区别?Java 语言属于编译型编程语言还是解释型编程语言?
- MySQL中你必须知道的10件事,1.5万字!
- 董明珠的“接班人”出现了?22岁董明珠女秘书火了!本人回应...
- idea添加添加自动添加版本控制
- scheme中文编程
- C++通过WMI获取硬件配置信息
- 做php的灯就灭,121128 还原 我是做PHP的,女嘉宾把灯全灭了 真相
- 全栈工程师眼中的HTTP
- win7计算机中找不到硬盘分区,解决方案:系统找不到硬盘分区的原因
- sts导报快捷键_综合技术--sts常用快捷键
- 基于matlab仿真的功率因数测定方法研究,基于MATLAB的高功率因数整流器仿真实验平台研究...
- 矩阵分析与多元统计II 二次型与二次曲面1 线性函数与对偶空间
热门文章
- zookeeper初探二 windows环境搭建伪集群
- [HDU 4344]Mark the Rope(Pollard_rho+Miller_Rabin)
- android120 zhihuibeijing 开机页面
- 数据挖掘中的概念描述
- iOS开发-编译出错 duplicate symbols for architecture x86_64
- c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)
- SPOJ - LCS2 Longest Common Substring II(后缀自动机)
- POJ - 2318 TOYS(叉积+二分)
- 中石油训练赛 - 腿部挂件(可持久化字典树)
- 安卓进阶系列-04自定义原型图片显示(CircleImageView)的使用