《剑指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次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...
随机推荐
- H5传奇源码,附带微信支付,商城系统,新增了元宝交易商城系统源码
源码说明:传奇游戏是80年底的经典游戏,传奇源码,H5游戏源码下载,附带微信支付,商城系统,新增了元宝交易商城系统源码,内置很多任务,比如首冲任务,修复了很多BUG.[架设要求]游戏名称:H5传奇世界 ...
- 深入理解计算机系统 第十章 系统级I/O 第二遍
了解 Unix I/O 的好处 了解 Unix I/O 将帮助我们理解其他的系统概念 I/O 是系统操作不可或缺的一部分,因此,我们经常遇到 I/O 和其他系统概念之间的循环依赖.例如,I/O 在进程 ...
- 在react项目当中做导航守卫
距离上一篇文章,似乎已经过去好久了. 确实是最近相对忙了一点,本身是用vue重构之前一个传统的项目,就自己一个人写.而且,在稍微闲暇之余,想着同时用react也重构一遍,也算是对react的学习吧!毕 ...
- 怎样使用 v-if 实现 html 元素的显示 / 隐藏?
1. 首先, 指令后的引号内是可以写 js 表达式的, 这点很重要. v-if 的用法很简单, 只需要给 v-if = " " 的引号内放一个 布尔值 即可. 注意: v-if 的 ...
- HTML——form表单中常用标签 form input (text hidden password radio checkbox reset submit ) select(option)总结
<form action="" method="get"> <!-- placeholder="请输入文本" 显示提示 r ...
- axios配置
import axios, { isCancel } from 'axios' import { md5 } from 'vux' import util from '@/libs/util' imp ...
- json返回数据多个是数组,单个就不是处理方案
/// <summary> /// 计算方案 当前返回的对象 /// </summary> [JsonConverter(ty ...
- Pr PS 笔记
1. 保存窗口配置 窗口-新建工作区 2. 添加快捷键 编辑-自定义快捷键 3. 添加关键帧,需要下拉轨道 4. 关闭PR声音 5. 视频稳定器 选中素材,右键选择嵌套,嵌套后在子序列把视频画 ...
- 微信小程序常用事件
bind bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡. bindtap 跳转页面 bindchange .value 改变时触发 change 事件 bi ...
- 第二十四篇 jQuery 学习6 删除元素
jQuery 学习6 删除元素 上节课我们做了添加元素,模拟的是楼主发的文章,路人评论,那么同学们这节课学了删除之后,去之前的代码上添加一个删除,模拟一个楼主删除路人的评论. jQuery的删除方 ...