问题描述
小F正在玩一个套碗的游戏,每个碗都有一个编号,从1到n,它们从大到小被套在一根木棍上。小F只能从木棍上取最上面的碗,每次只能取一个。现在你需要判断给定的取碗顺序是否可行。如果可行,那么返回1,否则返回0。
例如,对于2个碗,取碗的顺序可以是 2 1
或 1 2
,这两种顺序都是合法的。而对于3个碗,给定顺序 3 1 2
不可能通过合法操作实现,因此该顺序不可行。
测试样例
样例1:
输入:
M = 2, a = [1, 2]
输出:1
样例2:
输入:
M = 3, a = [3, 1, 2]
输出:0
样例3:
输入:
M = 4, a = [1, 3, 2, 4]
输出:1
题解:
很明显是栈的一道题,按照正常的拿取的思路,如果遇到比栈顶大的,就要把之前没入过栈的元素压入栈,然后取出栈顶,遇到已经进入的,就检查当前栈顶是否相等,不相等及不通过。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<map>
#include<set>
using namespace std;
typedef long long int ll;int solution(int M, std::vector<int> a) {int i,j,maxa=0;vector<int> vt(M+1,0);stack<int> st;for(i=0;i<a.size();i++){if(a[i]>maxa){maxa=a[i];for(j=1;j<a[i];j++){if(vt[j]!=1){st.push(j);}}vt[a[i]]=1;}else if(a[i]<=maxa){if(!st.empty() && st.top()!=a[i]){return 0;}else if(st.top()==a[i]){st.pop();vt[a[i]]=1;}}}return 1;
}int main() {std::vector<int> a1 = {1, 2};std::cout << (solution(2, a1) == 1) << std::endl;std::vector<int> a2 = {3, 1, 2};std::cout << (solution(3, a2) == 0) << std::endl;std::vector<int> a3 = {1, 3, 2, 4};std::cout << (solution(4, a3) == 1) << std::endl;return 0;
}