《剑指offer》算法题第六天
今日题目:
- 顺时针打印矩阵
- 包含min函数的栈
- 栈的压入、弹出序列
- 从上到下打印二叉树
- 二叉树搜索树的后序遍历序列
- 二叉树中和为某一值的路径
今天的题目都比较简单,下面一一介绍:
1. 顺时针打印矩阵
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 思路:
运用类似于剥洋葱的方法将矩阵一层一层地输出。
代码如下:
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> res = new ArrayList();
if(matrix.length == 0) return res;
int colBegin = 0, colEnd = matrix[0].length-1;
int rowBegin = 0, rowEnd = matrix.length-1;
while(colBegin <= colEnd && rowBegin <= rowEnd){
for(int i = colBegin; i <= colEnd; i++)
res.add(matrix[rowBegin][i]);
rowBegin++;
for(int i = rowBegin; i <= rowEnd; i++)
res.add(matrix[i][colEnd]);
colEnd--;
if(rowBegin <= rowEnd){
for(int i = colEnd; i >= colBegin; i--)
res.add(matrix[rowEnd][i]);
rowEnd--;
}
if(colBegin <= colEnd){
for(int i = rowEnd; i >= rowBegin; i--)
res.add(matrix[i][colBegin]);
colBegin++;
}
}
return res;
}
}
2. 包含min函数的栈
题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 思路:
维护两个栈,一个用来存数据,一个用来存当前的最小值。
代码如下:
public class Solution {
Stack<Integer> stack = new Stack();
Stack<Integer> min_stack = new Stack();
public void push(int node) {
stack.push(node);
if(min_stack.empty())
min_stack.push(node);
else{
if(min_stack.peek() >= node)
min_stack.push(node);
}
}
public void pop() {
int num = stack.pop();
if(num == min_stack.peek())
min_stack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
if(min_stack.empty())
return -1;
else
return min_stack.peek();
}
}
3.栈的压入、弹出序列
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 思路:
维护一个栈,同时遍历两个序列,如果两个序列一个位置的值不相同,则判断弹出序列和栈顶的值是否相同,若不同,将压入序列的当前值压入栈中;若相同,将栈顶弹出。
代码如下:
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
Stack<Integer> stack = new Stack();
int i = 0, j = 0;
while(i < pushA.length){
if(pushA[i] == popA[j]){
i++;
j++;
continue;
}else if(!stack.empty() && stack.peek() == popA[j]){
stack.pop();
j++;
}else{
stack.push(pushA[i]);
i++;
}
}
while(j < popA.length){
if(stack.empty() || stack.pop() != popA[j])
return false;
j++;
}
return true;
}
}
4. 从上到下打印二叉树
题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路:没什么好说的,队列实现层次遍历。
代码如下:
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> res = new ArrayList();
if(root == null) return res;
LinkedList<TreeNode> queue = new LinkedList();
queue.offer(root);
while(!queue.isEmpty()){
root = queue.poll();
res.add(root.val);
if(root.left != null)
queue.offer(root.left);
if(root.right != null)
queue.offer(root.right);
}
return res;
}
}
5. 二叉搜索树的后序遍历序列
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路:
这题考察的是二叉搜索树的性质:左子树小于根,右子树大于跟
以及后序遍历序列的性质:最后一个数为根节点
清楚这两单就很容易写出代码
代码如下:
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length <= 1)
return sequence.length==1;
return isbst(sequence,0,sequence.length-1);
}
public boolean isbst(int[] nums,int start,int end){
if(start > end) return true;
int root = nums[end];
int ind = start;
while(nums[ind] < root) ind++;
for(int i = ind; i < end; i++){
if(nums[i] < root)
return false;
}
return isbst(nums,start,ind-1)&&isbst(nums,ind,end-1);
}
}
6.二叉树中和为某一值的路径
题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路:
题目比较简单,利用DFS就能实现,但是得注意判断符合条件语句和回溯的细节
代码如下:
public class Solution {
ArrayList<ArrayList<Integer>> res = new ArrayList();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null) return res;
findpath(root,target,new ArrayList());
return res;
}
public void findpath(TreeNode root,int target,ArrayList<Integer> tmp){
tmp.add(root.val);
if(root.left == null && root.right==null){
if(target == root.val)
res.add(new ArrayList(tmp));
}else{
if(root.left != null)
findpath(root.left,target-root.val,tmp);
if(root.right != null)
findpath(root.right,target-root.val,tmp);
}
tmp.remove(tmp.size()-1);
}
}
《剑指offer》算法题第六天的更多相关文章
- 剑指offer算法题
数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字): 解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以 ...
- 剑指offer算法总结
剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...
- 剑指Offer——算法复杂度中的O(logN)底数是多少
剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- 剑指Offer编程题2——替换空格
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 剑指offer编程题66道题 36-66
36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
- LeetCode剑指Offer刷题总结(一)
LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...
- 剑指offer编程题Java实现——面试题11数值的整数次方
题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...
随机推荐
- django进阶版4
目录 1 Auth模块是什么 2 auth模块常用方法 authenticate() login(HttpRequest, user) logout(request) is_authenticated ...
- python自带queue
from queue import Queue # 线程安全队列 def thread_queue(): q = Queue(3) # 这个队列最多进多少东西 q.put('a') q.put('b' ...
- 向量运算(lua,三维) 点乘、叉乘、模、夹角
向量运算在游戏制作中经常用到,稍微总结一下. 一.点乘 如图,假设 向量a与b的点乘表示a在b上的投影与b的模的乘积 公式: 代码: function MathHelper.GetVector3D ...
- thymeleaf 模板使用 之 解决因HTML标签未闭合引起的错误
一.修改thymeleaf属性配置 spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring ...
- 解决FileInputStream 读取文件中文乱码问题(转)
当Java中使用 FileInputStream 读取txt等文档时,中文会产生乱码,解决方法如下: try { fis = new FileInputStream(file); InputStrea ...
- axios配置
import axios, { isCancel } from 'axios' import { md5 } from 'vux' import util from '@/libs/util' imp ...
- Python——用turtle画一个月饼
今天是中秋节,首先在这里祝大家中秋快乐!那么提到中秋,我们首先想到的当然是香甜的月饼,所以我今天就在这里画一个月饼送给大家. 那么 要用Python画图,我们必须掌握并运用Turtle库,这个可以自己 ...
- springcloud(十二)-springcloud-config统一管理微服务配置
1.为什么要统一管理微服务配置 对于传统的单体应用,常使用配置文件管理所有配置.例如一个SpringBoot开发的单体应用,可将配置内容放在application.yml文件中.如果需要切换环境,可设 ...
- Innodb、MYISAM的文件存储结构
MySQL的每个数据库都对应存放在一个与数据库同名的文件夹中,MySQL数据库文件包括MySQLserver所创建的数据库文件和MySQL所用存储引擎创建的数据库文件. 查看MySql数据库物理文件存 ...
- Mycat1.6启动报NumberFormatException解决方案(server内存太大)
https://blog.csdn.net/lijieshare/article/details/84826280 2019-09-02 18:28:27,829 [ERROR][main] 2019 ...