算法小知识-------02·16-------双栈成队 + 二维找目标

194 阅读2分钟

这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

今天打开了剑指offer的相关题型,找找感觉

用两个栈实现队列

该题出自力扣的剑指 Offer 09. 用两个栈实现队列【简单题】

审题

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

  • 题型也是比较清晰明了,也就是设计出利用两个栈实现一个队列的功能;
    • 栈:触底反弹,先进后出
    • 队列:先进先出
    • 用两个栈去模拟 队列的实现
      • 栈1,栈2
      • 栈1功能: 进队列
      • 栈2功能: 出队列
    • 解决核心:
      • 进队列只需要进栈1即可
      • 出队列需要遵循队列的先进先出规则
        • 需要把栈1的数据push进栈2
        • 如果栈1为空,则返回-1
        • 栈2弹出首个数据

编码

class CQueue {

   Stack<Integer> stack1 = new Stack();
   Stack<Integer> stack2 = new Stack();
   public CQueue() {
       
   }
   
   public void appendTail(int value) {
       stack1.push(value);
   }
   
   public int deleteHead() {
       if(stack2.isEmpty()){
           if(stack1.isEmpty())return -1;
           while(!stack1.isEmpty()){
               stack2.push(stack1.pop());
           }
       }
       return stack2.pop();
   }
}

image.png

二维数组中的查找

该题出自力扣的剑指offer 04-二维数组的查找【中等题】

审题

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

  • 该题题意就是给出一个二维数组,找出目标数是否存在
  • 之前也有做过类似的题型
  • 思路: 把目光聚焦在二维数组的右上角,把解题思路转换成 Binary Search Tree
     [1,   4,  7, 11, 15],
     [2,   5,  8, 12, 19],
     [3,   6,  9, 16, 22],
     [10, 13, 14, 17, 24],
     [18, 21, 23, 26, 30]
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0) {
            return false;
        }
        int m = matrix.length,n = matrix[0].length;
        int h = 0,l = n -1;
        while(h<m && l >= 0){
            if (matrix[h][l] > target){
                l--;
            }else if (matrix[h][l] < target){
                h++;
            }else return true;
        }
        return false;
    }

image.png