【程序员面试宝典】栈的应用
来源:互联网 发布:minecraft0.15js 编辑:程序博客网 时间:2024/05/22 00:11
1、下一个较大元素
现在我们有一个int数组,请你找出数组中每个元素的下一个比它大的元素。
给定一个int数组A及数组的大小n,请返回一个int数组,代表每个元素比他大的下一个元素,若不存在则为 - 1。保证数组中元素均为正整数。
测试样例:[11, 13, 10, 5, 12, 21, 3], 7
返回:[13, 21, 12, 12, 21, -1, -1]
问题分析:
(1)首先建立辅助数组用来存放排好的数据;
(2)建立辅助数组用来记录入栈的数据,因为最后一个数据的下一个比它大的元素肯定不存在,所以将-1先入栈;
(3)从后向前一次遍历,如果栈顶元素不等于-1且当前数组中的元素大于栈顶元素,弹出当前的栈顶元素,并更新当前栈顶元素;
(4)否则将栈顶元素插入到辅助数组中,并将当前数组中的元素进行压栈操作,遍历完成后返回辅助数组即可。
代码实现:
vector<int> findNext(vector<int> A, int n){vector<int> res;if (n <= 0)return res;stack<int> s;s.push(-1);for (int i = n - 1; i >= 0; --i){int top = s.top();while (top != -1 && A[i] > top){s.pop();top = s.top();}res.insert(res.begin(), top);s.push(A[i]);}return res;}
2、下一个较大的元素二现在有一个数组,请找出数组中每个元素的后面比它大的最小的元素,若不存在则为-1。
给定一个int数组A及数组的大小n,请返回每个元素所求的值组成的数组。保证A中元素为正整数,且n小于等于1000。
测试样例:[11,13,10,5,12,21,3],7
返回:[12,21,12,12,21,-1,-1]
问题分析:
(1)首先这两道题的思路都差不多,只不过下面的这道题更加复杂,我们采用最常规的方法进行解决;
(2)建立和给定数组一样大的辅助数组,并将其中的元素都初始化为-1;
(3)采用两重for循环,如果一次遍历寻找大于当前元素的最小元素的值。
代码实现:
vector<int> findNext(vector<int> A, int n) {vector<int> res(n, -1);for (int i = 0; i < n; i++){for (int j = i + 1; j < n; j++){if (A[i] < A[j]){if (res[i] == -1)res[i] = A[j];elseres[i] = min(res[i], A[j]);}}}return res;}
阅读全文
0 0
- 【程序员面试宝典】栈的应用
- 单链表的操作(程序员面试宝典)
- 程序员面试宝典的一点笔记
- 程序员面试宝典题目-栈、队列
- 程序员面试宝典
- 程序员面试宝典A
- Java程序员面试宝典
- Java程序员面试宝典
- java程序员面试宝典
- JAVA程序员面试宝典
- Java程序员面试宝典
- 程序员面试宝典
- 《程序员面试宝典》摘记
- 程序员面试宝典
- 程序员面试宝典总结
- 程序员面试宝典笔记
- 程序员面试宝典
- JAVA程序员面试宝典
- 微信小程序中 input空间输入文字如何清空
- 自定义圆圈进度条
- Java经典算法40例(十)
- 算法复习:数组中只出现一次的数字
- c#基础知识扩展篇2
- 【程序员面试宝典】栈的应用
- 【阿柟碎碎念】暑期集训篇
- Android-手势-实现图片左右滑动效果
- PAT-1007. Maximum Subsequence Sum (25)
- 链表求和
- POJ 3091 Triangular N-Queens Problem 笔记
- xamarin android使用gps定位获取经纬度
- POJ 3020 Antenna Placement (最小边覆盖/最大匹配应用)
- 个人感悟