这是我参与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();
}
}
二维数组中的查找
该题出自力扣的剑指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;
}