单调栈和哈希表c语言题目:力扣496. 下一个更大元素 I(参考官解)

单调栈和哈希表c语言题目:力扣496. 下一个更大元素 I(参考官解)_第1张图片

 1、假设有一组数据 5、7、3、4、6、2我们的目的是存储每一位元素的后一项比他大的第一个数,如若没有,则用-1代替。这里用用a[6]数组存储。

2、由于c语言具体实现栈操作较复杂,这里用stake[6]代替栈。

3、具体实现,我们从这一组数据中最后一个元素开始1思考,由于最后一位元素没有后继,故其后面没有比他大的,则初始a[5]=-1,并将该值放入栈中。我们接着往前遍历,6比2要大,这时2出栈(为什么出栈?因为6比2大了,假如前面比2小,肯定首先会比6小,所以2没有存在意义了),由于发现2比6小,所以令a[4]=-1。继续往前,这时发现,4比6小,所以a[3]=6,将4入栈,(6继续保留在栈中,防止出现比4大比六小的,这样只要出栈4,就可以和6比较了)。3比4小,a[2]=4,3入栈,7比3大,出栈3,7比4大,出栈4,7比6大,出栈6,此时栈空,故没有比7大的数,a[1]=-1,将7入栈。最后5小于7,a[0]=7,所有的元素都找到了他对应的最大值。

4、综上

①初始条件,a[numsSize-1]=-1,stake[0]=nums[numsSize-1]。

②入栈条件:当遍历值小于栈顶,先储存栈顶值(为遍历点的目标值),再入栈。

③出栈条件:当遍历值大于栈顶元素,一直出栈,直到找到大于它的值或者栈空,若栈空,该点目标值为-1,再将该点入栈。

5,力扣这题,有了单调栈存储的前提,可直接用数组下标直接找出给定元素对应的最大值。


int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
int *ret=malloc(sizeof(int)*nums1Size);
int a[10001],i,stake[nums2Size],top=-1;//a[]数组为索引数组,stake[]为栈
*returnSize=0;
stake[++top]=nums2[nums2Size-1];
a[nums2[nums2Size-1]]=-1;//num2数组最后一个元素后面没有比他大的
for(i=nums2Size-1;i>0;i--)
{
    while(top!=-1&&stake[top]

你可能感兴趣的:(笔记,力扣)