《剑指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次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...
随机推荐
- P1417 烹调方案(思维+01背包)
(点击此处查看原题) 题意 有n种食材,每种食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间.问在T时间内,什么样的烹调方案 ...
- python 基础(十八)--shutil模块
shutil模块 shutil.copyfileobj(src,dst):只拷贝文件内容,需要open文件:目标文件不存在时创建,存在时覆盖 shutil.copyfileobj(open('old. ...
- Online Meeting CodeForces - 420B (思维)
大意: 给定某一段连续的上线下线记录, 老板上线或下线时房间无人, 并且每次会议都在场, 求哪些人可能是老板. 结论1: 从未出现过的人一定可以是老板. 结论2: 出现过的人中老板最多只有1个. 结论 ...
- oracle建表详细信息
一张用户表 -- Create table create table OA_DM.DM_GY_USER ( ), username ) not null, loginname ) not null, ...
- Datetime 在C#中的用法 获取当前时间的各种格式
DateTime 获得当前系统时间: DateTime dt = DateTime.Now; Environment.TickCount可以得到“系统启动到现在”的毫秒值 DateTime now = ...
- Power BI 行级别安全性 (RLS)
在 Power BI Desktop 中定义角色和规则 你可以在 Power BI Desktop 中定义角色和规则. 发布到 Power BI 时,它还会发布角色定义. 若要定义安全角色,请执行以下 ...
- [转载]Pytorch中nn.Linear module的理解
[转载]Pytorch中nn.Linear module的理解 本文转载并援引全文纯粹是为了构建和分类自己的知识,方便自己未来的查找,没啥其他意思. 这个模块要实现的公式是:y=xAT+*b 来源:h ...
- http协议:http请求、http响应、间隔时间跳转页面、禁用浏览器缓存
转自:https://blog.csdn.net/u013372487/article/details/46991623 http协议 1. http协议是建立在 tcp/ip协议基础上. 2. 我 ...
- Flink 1.0到1.9特性
Flink API 历史变迁 在 Flink 1.0.0 时期,加入了 State API,即 ValueState.ReducingState.ListState 等等.State API 可以认为 ...
- ZooKeeper--动物管理员
复杂的软件集群系统从来绕不开高可用.负载均衡等问题,大数据系统更是如此. 高可用:计算机系统的可用性定义为系统保持正常运行时间的百分比,具体手段有自动检测,自动切换,自动恢复等. 负载均衡:主要解决单 ...