剑指offer之16-20题解


目录

  1. 合并两个排序的链表
  2. 树的子结构
  3. 二叉树的镜像
  4. 顺时针打印矩阵
  5. 包含min函数的栈

16. 合并两个排序的链表

(一)题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

(二)思路

  1. 递归:如果list1.val<=list2.val,则list1位置不变,它的下一位从list1.nextlist2中选出。递归。否则list2的位置不变,它的下一位从list1list2.next中选出。递归。

  2. 迭代:跟归并排序一样,当两个链表不为null时,谁小谁依次加入head节点。最后会有list1或者list2剩余节点没有加入,遍历加入即可。

(三)代码实现

  1. 递归代码实现
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;}}
}
  1. 迭代代码实现
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:我们约定空树不是任意一个树的子结构)

(二)思路

  1. isSubtreeWithRoot()方法:

    1. 判断节点A和B是否相同,如果不同返回false。
    2. 如果相同继续递归A的左孩子和B的左孩子,A的右孩子和B的右孩子看是否相同。
    3. 当root2==null时,说明比较完毕,返回true;
    4. 当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. 二叉树的镜像

(一)题目描述

(二)思路

  1. 交换左右节点,然后依次递归下去。

(三)代码实现

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.

(二)思路

  1. 找到左上角和右下角,打印一圈,然后左上角++,右下角–,再次打印一圈,依次类推

(三)代码实现

  1. 大佬代码
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;}
}
  1. 比较好理解的代码,不过长了一点
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。

  1. push操作:dataStack直接入栈,minStack如果为null,直接入栈,不为nullpeek出栈顶元素和入栈的元素比较,谁小谁入栈。
  2. pop操作:两个栈直接pop。
  3. top操作:返回dataStack.peek().
  4. 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题解相关推荐

  1. 剑指offer——面试题20:顺时针打印矩阵

    剑指offer--面试题20:顺时针打印矩阵 Solution1: 可参考leetCode 54题的解法 书上的思路特别好,学习之~ class Solution { public:vector< ...

  2. 【剑指offer】java版题解(持续更新)

    本文为刷[剑指]备战校招的过程,持续更新 备战虽晚但卷,共勉! 目录,按刷题时间排序 斐波那契数列 用两个栈实现队列 二维数组中的查找 包含min函数的栈 从尾到头打印链表 反转链表 复杂链表的复制 ...

  3. 剑指offer 面试16题

    面试16题: 题目:数值的整数次方 题:实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题 ...

  4. java 打印_剑指Offer面试题20(Java版):顺时针打印矩阵

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵: 1,2,3,4 5,6,7,8 9,10,11,12 13,14,15,16 则依次打印出数字1,2,3, ...

  5. 剑指offer面试题[20]-顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  6. 【剑指Offer】16重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  7. C++剑指offer刷题笔记

    说明:本文是本人刷题后整理的剑指offer1-68题的题解笔记,编程语言为c++. 主要参考刷题笔记网址:leetcode剑指offer 次要参考刷题笔记网址:牛客剑指offer 剑指OFFER 面试 ...

  8. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

  9. 《剑指 Offer》题目汇总

    文章目录 1. 数组 2. 链表 3. 栈和队列 4. 哈希表 5. 字符串 6. 树 7. 堆 8. 回溯和深度优先搜索 9. 递归和循环 10. 双指针 11. 动态规划 12. 贪心算法 13. ...

  10. JS版剑指offer

    JS版剑指offer JS刷题总结 牛客网 递归算法的时间复杂度:递归的总次数*每次递归的数量. 递归算法的空间复杂度:递归的深度*每次递归创建变量的个数. 二叉树(12道): 剑指Offer(4): ...

最新文章

  1. JShell:Java REPL综合指南
  2. ASP.NET如何给控件增加属性?
  3. Python:__slots__()方法和@property方法
  4. (转)JAVA AJAX教程第三章—AJAX详细讲解
  5. QM课程02-外部功能
  6. k8s 手动恢复redis 集群_二进制手动部署k8s-1.14高可用集群(二、集群部署)
  7. redis nosql_NoSql数据库:Cassandra,Mongo,Redis数据库比较
  8. 使用Lucene的搜索服务器搜索Jira问题
  9. Java 答疑:编译器和解释器有何区别?Java 语言属于编译型编程语言还是解释型编程语言?
  10. MySQL中你必须知道的10件事,1.5万字!
  11. 董明珠的“接班人”出现了?22岁董明珠女秘书火了!本人回应...
  12. idea添加添加自动添加版本控制
  13. scheme中文编程
  14. C++通过WMI获取硬件配置信息
  15. 做php的灯就灭,121128 还原 我是做PHP的,女嘉宾把灯全灭了 真相
  16. 全栈工程师眼中的HTTP
  17. win7计算机中找不到硬盘分区,解决方案:系统找不到硬盘分区的原因
  18. sts导报快捷键_综合技术--sts常用快捷键
  19. 基于matlab仿真的功率因数测定方法研究,基于MATLAB的高功率因数整流器仿真实验平台研究...
  20. 矩阵分析与多元统计II 二次型与二次曲面1 线性函数与对偶空间

热门文章

  1. zookeeper初探二 windows环境搭建伪集群
  2. [HDU 4344]Mark the Rope(Pollard_rho+Miller_Rabin)
  3. android120 zhihuibeijing 开机页面
  4. 数据挖掘中的概念描述
  5. iOS开发-编译出错 duplicate symbols for architecture x86_64
  6. c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)
  7. SPOJ - LCS2 Longest Common Substring II(后缀自动机)
  8. POJ - 2318 TOYS(叉积+二分)
  9. 中石油训练赛 - 腿部挂件(可持久化字典树)
  10. 安卓进阶系列-04自定义原型图片显示(CircleImageView)的使用