输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), push(4), pop() -> 4,push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1示例 2:输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]输出:false解释:1 不能在 2 之前弹出。思路:用一个栈stk来依次保存pushed数组的数,每保存一个数后,查看当前popped数组的第一个数,如果第一个数和stk栈顶元素相同,说明stk需要pop,stk执行pop,再查看
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回 0.minStack.min(); --> 返回 -2.思路:用一个栈来保存push和pop的数。push和pop的时间复杂度不用多管,直接就符合题意。问题在于min函数。如果用一个变量x记录最小值,则可以每次都在O(1)的时间内执行min。但是如果pop的就是当前的最小值,再直接返回x就无法正确返回最小值。所以栈里存的数要跟最小值联系上。每次push和pop的时候去更新最小值。这时差值就非常适合。如果栈里保存的数就是每次push的数和最小值的差值,那么push和pop的时候,就可以正常执行,并且可以正确维护最小值代码
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]思路:就是按照题意顺时针访问,一次一圈。需要注意的是当只有一行或只有一列的情况,需要做好判断。代码:class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { int m = matrix.size(); if (m == 0) { return {}; } int n = matrix[0].size(); int top = 0,bottom = m-1,left = 0,right
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。思路:一颗对称的二叉树,其左右节点是对称(要么没有左右节点,要么有两个相等的左右节点)。左子树和右子树也满足这个要求。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool symmetriTree(TreeNode* root1, TreeNode* root2) { if(root1 == nullptr && root2 == nullptr) { return true;
输入两棵二叉树A和B,判断B是不是A的子结构。B是A的子结构, 即 A中有出现和B相同的结构和节点值。思路:遍历树A,如果当前节点p和树B的根节点r相同,则以树A的当前节点p为起始点,树B的根节点r为起始点进行遍历匹配。如果结果返回false,则继续遍历p左子树和右子树,重复上面的过程。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: //判断树B是否是以A为根节点的树是否匹配 bool isSubTree(TreeNode* A, TreeNode* B) { if(B == nullptr) { return true;