学习记录2

博客讲述了博主在解决栈的出栈序列问题时遇到的时间复杂度问题,最初采用暴力方法导致超时,后通过改进算法实现AC。文章介绍了优化后的思路,即模拟入栈过程并检查是否符合出栈序列,最终通过栈顶指针判断序列可行性。此外,博主还提及学习了大学物理和英语,并记录了一个关于分部积分的解题技巧。
摘要由CSDN通过智能技术生成

继续是栈和队列,今天主要是栈,做了一道关于出栈序列的题目。

最开始我用暴力的方法将每出现的数包含其本身往后确认,使用过的数字用vis数组标记,于是我可以随着序列数字的推进每次都for循环往下推,如果一致那么就算是可实现的序列,而要是有匹对不上的数字那么就代表序列错误。可是当我提交上去时,显示的是时间超限,于是我开始换思路。

咳咳,最后,在借鉴了一下别人的思路之后终于是成功ac。思路如下:首先将序列输入到一个数组中,自定义一个函数,功能为在一个for循环中按原本题目设定的入栈顺序入栈,可在入栈的同时也判断是否达到输入出栈序列的第一个数,如果达到了,也就是两数一致的时候,在入栈的数组中进行pop,也就是我模拟的top--,同时也要给出栈序列的下标++,这样子就可以让入栈了的数字与出栈序列里的数字相比较,没有违背入栈顺序,也可以跟按照出栈顺序出栈,而现在,当入栈for完成之后,如果出栈顺序是可行的话呢,此时栈中不会有任何数,也就是说top是<=0的。所以,方法正确,可执行。

题目如下:

代码如下:

#include <stdio.h>
int p[10010],q[10010],top,top2,n,k,i;
int jud()
{
    for(i=1;i<=n;i++)
        {
            q[++top]=i;
            while(top>=1&&q[top]==p[top2])
                top--,top2++;
        }
    if(top>0)
        return 1;
    return 0;
}
int main()
{
    while(1)
    {
        scanf("%d",&n);
        if(n==0)
            break;
        while(1)
        {
            top=0;top2=1;
            scanf("%d",&k);
            if(k==0)
                break;
            p[1]=k;
            for(i=2;i<=n;i++)
                scanf("%d",p+i);
            if(jud())
                printf("No\n");
            else printf("Yes\n");
        }
        printf("\n");
        
    }
    return 0;
}

咳咳,还有大学物理,写了几题考试真题,虽然还有困惑,可还在可解决的范围之内,以及大学英语,主要是记了十几个单词。写了几个不定积分分部积分法的题目,了解了有理函数的积分问题,对了,高数老师有讲一个解分部积分题的技巧,就是当我们分部积分时总会需要挑选U和V',此时有一个推荐的使用,即“反函数、对数函数、幂函数、指数函数、三角函数”的顺序,当出现这些函数时,靠前的用作U,后者则当作V',这个值得记录。

其实这样的学习效率还远远不够,明天要好好改善,要有效率的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值