《剑指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次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...
随机推荐
- Mysql-Sqlalchemy-多表操作
import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declar ...
- 最全最新java面试题系列全家桶(带答案)
最全最新java面试题系列全家桶(带答案) 置顶 2019年04月06日 22:40:28 青春季风暴 阅读数 14082 文章标签: java面试题技术栈 更多 分类专栏: 面试 版权声明:本文 ...
- ASP.NET Core MVC里面Razor如何获取URL参数
原文:ASP.NET Core MVC里面Razor如何获取URL参数 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...
- vs 2013 设置website项目端口
vs 2015/2013 设置website项目端口 在web项目创建之后,当我想重新debug时,出现the port xxx is in use 错误. 经过netstat分析,发现占用此项目端口 ...
- C++ const关键字以及static关键字
const可以用来修饰类中的成员函数以及成员变量以及类的对象 1.const修饰成员函数: 该函数是只读函数,不允许修改任何成员变量,但是可以使用类中的任何成员变量: 不允许修改任何非static的类 ...
- mqtt协议实现 java服务端推送功能(二)java demo测试
上一篇写了安装mosQuitto和测试,但是用cmd命令很麻烦,有没有一个可视化软件呢? 有,需要在google浏览器下载一个叫MQTTLens的插件 打开MQTTLens后界面如下: 打开conne ...
- jquery.validate.js表单验证 jquery.validate.js的用法
jquery.validate.js这个插件已经用了2年多了,是一个不可多得的表单验证最方便快捷的插件.基于jquery的小插件,基本小白一学就会上手,对于项目表单页面比较多,元素比较多的校验,该插件 ...
- 关于学习电信nb-iot的小结
关于这几天对nb-iot的学习的总结和遇到的坑 初步学习nb-iot,了解到了nb-iot对于传感器数据传输功能的强大: 废话不多说,对于nb-iot我们选择的有人的模块,选择B5频段也就是电信的nb ...
- element-ui 表单自定义日期输入校验
methods: { validateDate(rule, value, callback){ if (value) { let timestamp = new Date(value).getTime ...
- Nginx访问限制配置
Nginx访问限制配置 nginx访问限制可以基于两个方面,一个是基于ip的访问控制,另一个是基于用户的信任登陆控制 下面我们将对这两种方法逐个介绍 基于IP的访问控制 介绍: 可以通过配置基于ip的 ...