数据结构——栈——寻找下一个较大元素

题目描述

给出一个数组,向右寻找每一个元素的下一个较大的元素,没有更大的则为-1

举例

{4,6,1,3,2,5}

则求得的答案应为

{6,-1,3,5,5,-1}

题目分析

首先对于这样的题目,我们总是先想到最简单的,那么就是枚举,每次循环一个元素,不停的向右找就可以了。时间复杂度应该是n^2

但是这样肯定是不够用的。

然后我们考虑,这道题我们实际上遇到的问题是什么?

其实简单的说,这道题的意思是,在变化的数组中找到下一个较大的值。

难点在于,数组元素的变化,以及不是找最大值,而是找下一个较大值。

这里就要用到我们的数据结构——栈

如何用栈来存放当前的值使之能在更短的时间内得出结果呢?

依旧结合图来分析。

图解分析

代码分析

/**
*求下一个最大值-stack
**/ 

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>

using namespace std;

int dataArray[6]={4,6,1,3,2,5};
int resultArray[6]={-1,-1,-1,-1,-1,-1};

//这边的栈保存的是原数组中的位置而不是数组元素本身
stack<int> desStack;

int main()
{
    int i=0,n=6;
    for(i=0; i<n; i++)
    {
        while(!desStack.empty() && dataArray[desStack.top()]<dataArray[i])
        {
            resultArray[desStack.top()] = dataArray[i];
            desStack.pop();
        }
        desStack.push(i);
    }

    for(i=0; i<n; i++)
    cout<<resultArray[i]<<"  ";

    return 0;
}

对于问题的思考

做完这道题我就慢慢的对栈这个数据结构的用法有了一些变化,之前是利用栈去求当前栈的最小值,这里是求下一个最大值。

问题本身可能有区别,但是有一些共性那就是,所要求的数据都是变长的,而所要求的数据都是以一种递增或者递减的顺序排列着,中间夹杂这别的元素。

而栈在这里起的作用就是1、保存了这种递增或者递减的次序。2、即使有新的元素加入就能通过出栈或者入栈来维护需要的答案。

所以,之后,在实际中,如果遇到一些变化长度的数据,但是数据的次序不发生改变,这种时候我们就可以使用栈,来辅助存放数据,来保存数据和求得结果。

对于求栈的最小值,可以参考我之前的博客。

时间: 2024-10-07 02:00:28

数据结构——栈——寻找下一个较大元素的相关文章

[Leetcode]下一个更大元素II

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数.如果不存在,则输出 -1. 示例 1: 输入: [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2: 数字 2 找不到下一个更大的数: 第二个 1 的下一个最大的数需要循环搜索,结果也是 2. 注意: 输入数组的长度不会超过 10000. 思路:

下一个更大元素 I(LeetCode 496)

题目 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素.如果不存在,对应位置输出-1. 示例 1: 输入: nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出: [-1,3,-1] 解释: 对于num1中的数字4,你无法在第二个数组中找到下一个更大的

496. 下一个更大元素 I

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素.如果不存在,对应位置输出-1. 示例 1: 输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释: 对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此

556. 下一个更大元素 III

556. 下一个更大元素 III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 12 输出: 21 示例 2: 输入: 21 输出: -1 代码 class Solution { public int nextGreaterElement(int n) { int[] array = transfer(n); /* 求出的下一个全排列可能会超出int类型的范围 这并不符合得出的答

[CTCI] 下一个较大元素

下一个较大元素 题目描述 现在我们有一个int数组,请你找出数组中每个元素的下一个比它大的元素. 给定一个int数组A及数组的大小n,请返回一个int数组,代表每个元素比他大的下一个元素,若不存在则为-1.保证数组中元素均为正整数. 测试样例: [11,13,10,5,12,21,3],7 返回:[13,21,12,12,21,-1,-1] 1 class NextElement { 2 public: 3 vector<int> findNext(vector<int> A, i

leetcode.496. 下一个更大元素 I

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素.如果不存在,对应位置输出-1. 示例 1: 输入: nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出: [-1,3,-1] 解释: 对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,

Leetcode 556.下一个更大元素III

下一个更大元素III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 12 输出: 21 示例 2: 输入: 21 输出: -1 C++: using next permutation int nextGreaterElement(int n) { auto digits = to_string(n); next_permutation(begin(digits), end(dig

[Swift]LeetCode503. 下一个更大元素 II | Next Greater Element II

Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. The Next Greater Number of a number x is the first greater number to its traversing-order next in the ar

LeetCode 556. 下一个更大元素 III(Next Greater Element III)

556. 下一个更大元素 III 556. Next Greater Element III 题目描述 给定一个 32 位正整数 n,你需要找到最小的 32 位整数,其与 n 中存在的位数完全相同,并且其值大于 n.如果不存在这样的 32 位整数,则返回-1. LeetCode556. Next Greater Element III中等 示例 1: 输入: 12 输出: 21 示例 2: 输入: 21 输出: -1 示例 3: 输入: 12443322 输出: 13222344 Java 实现