力扣 模拟小专题

简介: 力扣 模拟小专题

剑指 Offer 29. 顺时针打印矩阵

剑指 Offer 31. 栈的压入、弹出序列


题目:顺时针打印矩阵


输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。


示例 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]


限制:


0 <= matrix.length <= 100

0 <= matrix[i].length <= 100


模拟图示:


4adfbe6c5c879544927c57c91f80d5c6_5851be18a8694d4f8d47b80adcfe1755.png


顺序:从左到右,从上到下,从右到左,从下到上


AC代码:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        if(!matrix.size())
        return {};
        int a=0,b=matrix[0].size()-1,c=0,d=matrix.size()-1;
        vector<int>sum;
        while(1)
        {
            for(int i=a;i<=b;i++) sum.push_back(matrix[c][i]);//从左到右
            if(++c>d) break;
            for(int i=c;i<=d;i++) sum.push_back(matrix[i][b]);//从上到下
            if(--b<a) break;
            for(int i=b;i>=a;i--) sum.push_back(matrix[d][i]);//从右到左
            if(--d<c) break;
            for(int i=d;i>=c;i--) sum.push_back(matrix[i][a]);//从下到上
            if(++a>b) break;
        }
        return sum;
    }
};


题目:栈的压入、弹出序列


输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {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 之前弹出。


提示:


0 <= pushed.length == popped.length <= 1000

0 <= pushed[i], popped[i] < 1000

pushed 是 popped 的排列。


借助一个辅助栈,边让第一个数组读入,边判断第二个数组元素与其是否相等,相等则出栈,最后判断栈内是否为空

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) 
    {
        int n=pushed.size();
        int j=0;
        stack<int> st;
        for(int i=0;i<n;i++)
        {
            st.push(pushed[i]);//入栈
            while(!st.empty()&&st.top()==popped[j])//判断出栈
            {
                st.pop();
                j++;
            }
        }
        return st.empty();
    }
};

目录
相关文章
|
5月前
|
存储 算法 索引
力扣每日一题 6/24 模拟 数组 单调栈
力扣每日一题 6/24 模拟 数组 单调栈
32 0
|
5月前
|
算法
力扣每日一题 6/23 字符串/模拟
力扣每日一题 6/23 字符串/模拟
42 1
|
5月前
|
算法 数据挖掘 Java
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
|
5月前
力扣每日一题 6/18 字符串/模拟
力扣每日一题 6/18 字符串/模拟
28 0
|
5月前
|
Python
力扣随机一题 模拟+字符串
力扣随机一题 模拟+字符串
28 0
|
5月前
|
存储 算法 数据挖掘
力扣173题:二叉搜索树迭代器(含模拟面试)
力扣173题:二叉搜索树迭代器(含模拟面试)
|
索引
【LeetCode】环形链表+结论证明
【LeetCode】环形链表+结论证明
61 0
|
索引
【LeetCode】环形链表II+结论证明
【LeetCode】环形链表II+结论证明
63 0
poj 1068 模拟
大概题意就是告诉你有个n个小括号,每一个“)”左边有多少个“(”都告诉你了,然后让你求出每一对括号之间有多少对括号(包含自己本身)。 思路: 我先计算每个“)”左边有多少个“(”要匹配,然后每遇到一个“)”,然后向前寻找第一个可以匹配的“(”,找到后将其数量减一,这样的话在寻找的过程中经过了几个“)”就表示这对括号里面有多少括号。
24 0
|
机器学习/深度学习 存储 缓存
力扣70爬楼梯:思路分析+优化思路+代码实现+补充思考
力扣70爬楼梯:思路分析+优化思路+代码实现+补充思考
142 0