c++刷题(3/100)数独,栈和队列
stack的基本操作
• s.size()
:返回栈中的元素数量
• s.empty()
:判断栈是否为空,返回true或false
• s.push(元素)
:返回对栈顶部“元素”的可变(可修改)引用
• s.pop()
:删除栈顶元素,类型为void,但并不返回被删除的元素
• s.top()
:返回栈顶,不删除
• s1==s2
:若成立,表明s1中的每个元素都等于s2的对应元素,返回true或是false
题目1:用两个栈实现队列
https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=11158&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述
class Solution
{
public:
void push(int node) {
stack1.push(node) ;
} int pop() {
while(!stack1.empty()){
stack2.push(stack1.top()) ;
stack1.pop();
}
int res = stack2.top() ;
stack2.pop() ;
while(!stack2.empty()){
stack1.push(stack2.top()) ;
stack2.pop();
}
return res ;
} private:
stack<int> stack1;
stack<int> stack2;
};
题目2:滑动窗口最大值
https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788?tpId=13&tqId=11217&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
queue<int> q ;
deque<int> qmin ;
vector<int> ans ;
if(nums.size()==||k==){
return ans ;
}
for(int i=;i<k;i++){
if(qmin.empty()){
qmin.push_back(nums[i]) ;
}else{
while(!qmin.empty()&&qmin.back()<nums[i]) qmin.pop_back();
qmin.push_back(nums[i]) ;
}
q.push(nums[i]) ;
}
ans.push_back(qmin.front()) ;
for(int i=k;i<nums.size();i++){
if(qmin.front()==q.front()){
qmin.pop_front() ;
}
q.pop() ;
q.push(nums[i]) ;
while(!qmin.empty()&&qmin.back()<nums[i]) qmin.pop_back();
qmin.push_back(nums[i]) ;
ans.push_back(qmin.front()) ;
}
return ans ;
}
};
再看网上大神的版本:一个双端队列,代码也比我简洁。。。
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
deque<int> qmin ;
vector<int> ans ;
int k = size ;
if(num.size()==||size==){
return ans ;
}
for(int i=;i<num.size();i++){
// 每当新数进来时,如果发现队列头部的数的下标,是窗口最左边数的下标,则扔掉
if(!qmin.empty() && qmin.front() == i - k) qmin.pop_front();
// 把队列尾部所有比新数小的都扔掉,保证队列是降序的
while(!qmin.empty() && num[qmin.back()] < num[i]) qmin.pop_back() ;
// 加入新数
qmin.push_back(i) ;
// 队列头部就是该窗口内第一大的
if((i + ) >= (int)k) ans.push_back(num[qmin.front()]);
}
return ans ;
}
};
题目3:数独
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
空白格用 '.'
表示。
一个数独。
答案被标成红色。
Note:
- 给定的数独序列只包含数字
1-9
和字符'.'
。 - 你可以假设给定的数独只有唯一解。
- 给定数独永远是
9x9
形式的。
思路:搜索的题目,在能填数的位置先填一个数,然后判断合法性,如果合法就从该状态下再填下一个数。
本来以为要用A*,结果发现直接搜也没有超时,还有原题目是void函数,没有返回真的难受,搜索的题如果递归函数没有返回那怎么知道找到了没啊。
最后发现别人强行把示例的函数改成了bool型,然后可以过。
最后复习一下个位数的int-》char就是num+'0',char->int就是str-‘0’
class Solution {
public: bool checkIsLeagel(vector<vector<char>>& board,int x,int y){
for(int i=;i<;i++){
if(i!=x&&board[x][y]==board[i][y]){
return false ;
}
if(i!=y&&board[x][y]==board[x][i]){
return false ;
}
}
for(int i=*(x/);i<*(x/+);i++){
for(int j=*(y/);j<*(y/+);j++){
if(x!=i&&y!=j&&board[x][y]==board[i][j]){
return false ;
}
}
}
return true ;
} bool solveSudoku(vector<vector<char>>& board){
for(int i=;i<;i++){
for(int j=;j<;j++){
if(board[i][j]=='.'){
for(int k=;k<=;k++){
board[i][j] = k + '' ;
if(checkIsLeagel(board,i,j)&&solveSudoku(board)){
return true ;
}
board[i][j] = '.' ;
}
return false ;
}
}
}
return true ;
} };
priority_queue<int, vector<int>, less<int>> maxHeap; //存储小的值,值越大,优先级越高
priority_queue<int, vector<int>, greater<int>> minHeap; //存储大的值,值越小,优先级越高
双向队列:
- deq[ ]:用来访问双向队列中单个的元素。
- deq.front():返回第一个元素的引用。
- deq.back():返回最后一个元素的引用。
- deq.push_front(x):把元素x插入到双向队列的头部。
- deq.pop_front():弹出双向队列的第一个元素。
- deq.push_back(x):把元素x插入到双向队列的尾部。
- deq.pop_back():弹出双向队列的最后一个元素。
deque的一些特点
- 支持随机访问,即支持[ ]以及at(),但是性能没有vector好。
- 可以在内部进行插入和删除操作,但性能不及list。
- deque两端都能够快速插入和删除元素,而vector只能在尾端进行。
- deque的元素存取和迭代器操作会稍微慢一些,因为deque的内部结构会多一个间接过程。
- deque迭代器是特殊的智能指针,而不是一般指针,它需要在不同的区块之间跳转。
- deque可以包含更多的元素,其max_size可能更大,因为不止使用一块内存。
- deque不支持对容量和内存分配时机的控制。
- 在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointers、references、iterators失效。不过,deque的内存重分配优于vector,因为其内部结构显示不需要复制所有元素。
- deque的内存区块不再被使用时,会被释放,deque的内存大小是可缩减的。不过,是不是这么做以及怎么做由实际操作版本定义。
- deque不提供容量操作:capacity()和reverse(),但是vector可以。
c++刷题(3/100)数独,栈和队列的更多相关文章
- LeetCode 刷题笔记 155. 最小栈(Min Stack)
tag: 栈(stack) 题目描述 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素 ...
- C#LeetCode刷题之#155-最小栈(Min Stack)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4020 访问. 设计一个支持 push,pop,top 操作,并能 ...
- leetcode刷题-37解数独
题目 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 在每一个以粗实线分隔的 3x ...
- 刷题总结——生日礼物(bzoj1293单调队列)
题目: Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠, ...
- 【刷题笔记】DP优化-单调队列优化
单调队列优化 眼界极窄的ZZ之前甚至不会单调队列--(好丢人啊) 单调队列优化的常见情景: 转移可以转化成只需要确定一个维度,而且这个维度的取值范围在某个区间里 修剪草坪 这个题学长讲的好像是另外一个 ...
- 刷题总结——烽火传递(单调队列+dp)
题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...
- C#LeetCode刷题-栈
栈篇 # 题名 刷题 通过率 难度 20 有效的括号 C#LeetCode刷题之#20-有效的括号(Valid Parentheses) 33.0% 简单 42 接雨水 35.6% 困难 71 简 ...
- C#LeetCode刷题-设计
设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制 33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索 ...
- leecode刷题(9)-- 有效的数独
leecode刷题(9)-- 有效的数独 有效的数独 描述: 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 ...
随机推荐
- oracle 绝对值小于1的数值显示小数点前面的0
SELECT DECODE(TRUNC(-.98),0,REPLACE(TO_CHAR(-.98), '.', '0.'),TO_CHAR(-.98))FROM DUAL;
- C 语言疑难杂症 [转:http://blog.chinaunix.net/uid-20688544-id-1894880.html]
无聊在网上找了些C语言的东东练一下手,竟然发现其实还有好多细节之前,没注意到,该好好复习一下先. 解决掉的问题先不发出来,把疑问的先做个笔记,过几天解决了就回来修改补上. #include < ...
- MySQL---索引算法B+/B-树原理(二)
B+/-Tree原理 B-Tree介绍 B-Tree是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子:且M>2: 2.根结点的儿子数为[2, ...
- Solr实现SQL的查询与统计--转载
原文地址:http://shiyanjun.cn/archives/78.html Cloudera公司已经推出了基于Hadoop平台的查询统计分析工具Impala,只要熟悉SQL,就可以熟练地使用I ...
- 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...
- [二十一]SpringBoot 之 导入xml配置
SpringBoot理念就是零配置编程,但是如果绝对需要使用XML的配置,我们建议您仍旧从一个@Configuration类开始,你可以使用@ImportResouce注解加载XML配置文件,我拿一个 ...
- 洛谷 P4240 毒瘤之神的考验 解题报告
P4240 毒瘤之神的考验 题目背景 \(\tt{Salamander}\)的家门口是一条长长的公路. 又是一年春天将至,\(\tt{Salamander}\)发现路边长出了一排毒瘤! \(\tt{S ...
- 解题:APIO 2008 免费道路
题面 我们发现我们可以很容易知道最终完成的生成树中有多少鹅卵石路,但是我们不好得到这棵生成树的结构,所以我们尽量“谨慎”地完成生成树·,最好是一点点加到我们要达到的标准而不是通过删掉一些东西来完成 我 ...
- Dom4j 操作, 节点查找 添加 删除 修改 。。。xPath
转: Dom4j 操作, 节点查找 添加 删除 修改 ...xPath 2013年11月28日 10:48:59 今晚打酱油8 阅读数:8506更多 个人分类: JavaWeb 版权声明:本文为博 ...
- “玲珑杯”ACM比赛 Round #18 A 前缀预处理 D dp
DESCRIPTION 今天HHHH 考完了期末考试,他在教学楼里闲逛,他看着教学楼里一间间的教室,于是开始思考: 如果从一个坐标为 (x1,y1,z1)(x1,y1,z1) 的教室走到(x2,y2, ...