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

xiaoxiao2021-02-28  123

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]; else res[i] = min(res[i], A[j]); } } } return res; }

转载请注明原文地址: https://www.6miu.com/read-43213.html

最新回复(0)