【程序员面试宝典】栈的应用

来源:互联网 发布: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;}

原创粉丝点击