今日题目:

  1. 顺时针打印矩阵
  2. 包含min函数的栈
  3. 栈的压入、弹出序列
  4. 从上到下打印二叉树
  5. 二叉树搜索树的后序遍历序列
  6. 二叉树中和为某一值的路径

今天的题目都比较简单,下面一一介绍:

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》算法题第六天的更多相关文章

  1. 剑指offer算法题

    数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字): 解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以 ...

  2. 剑指offer算法总结

    剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...

  3. 剑指Offer——算法复杂度中的O(logN)底数是多少

    剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...

  4. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  5. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  6. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  7. 剑指offer编程题66道题 36-66

    36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...

  8. 牛客网剑指offer刷题总结

    二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...

  9. LeetCode剑指Offer刷题总结(一)

    LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...

  10. 剑指offer编程题Java实现——面试题11数值的整数次方

    题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...

随机推荐

  1. PAT A1046 Shortest Distance (20 分)

    题目提交一直出现段错误,经过在网上搜索得知是数组溢出,故将数组设置的大一点 AC代码 #include <cstdio> #include <algorithm> #defin ...

  2. 线性基求交(2019牛客国庆集训派对day4)

    题意:https://ac.nowcoder.com/acm/contest/1109/C 问你有几个x满足A,B集合都能XOR出x. 思路: 就是线性基求交后,有几个基就是2^几次方. #defin ...

  3. print格式化输出(format)

    一. print格式化输出,以及使用format控制 字符串的格式化方法分为两种,分别为占位符(%)和format方式.占位符方式在Python2.x中用的比较广泛,随着Python3.x的使用越来越 ...

  4. 使用EF Core 连接远程oracle 不需要安装oracle客户端方法

    连接字符串: Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=IP地址(PORT=1521))(CONNECT_DATA=(SERVICE_ ...

  5. 爬虫时安装的newspaper 新闻包

    Newspaper3k: Article scraping & curation 首先在命令行安装 newspaper pip install Newspaper3k 然后导入包进行写代码 f ...

  6. JavaScript中变量声明效率问题

    1 var theString1 = "字符串1"; var theString2 = "字符串1"; var theString3 = "字符串1& ...

  7. 中断或取消Promise链的可行方案

    ES6标准引入的异步编程解决方案Promise,能够将层层嵌套的回调转化成扁平的Promise链式调用,优雅地解决了“回调地狱”的问题.当Promise链中抛出一个错误时,错误信息沿着链路向后传递,直 ...

  8. 【Day1】2.安装运行Python

     视频地址(全部) https://edu.csdn.net/course/detail/26057 课件地址(全部) https://download.csdn.net/download/gentl ...

  9. 第十一章· MHA高可用及读写分离

    一.MHA简介 1.1.作者简介 松信嘉範: MySQL/Linux专家 2001年索尼公司入职 2001年开始使用oracle 2004年开始使用MySQL 2006年9月-2010年8月MySQL ...

  10. redis整合Spring入门

    首先 衷心感谢这篇博客给我入门时的启发  三颗心脏 你需要知道,spring的官方文档中已经注明,与redis整合时,spring的jar包版本不能低于4.2.6,否则不支持,会报错的哟 测试的时候请 ...