力扣(LeetCode)1441. 用栈操作构建数组(C语言)

一、环境说明

  1. 本文是 LeetCode 1441题 : 用栈操作构建数组,使用c语言实现
  2. 模拟栈
  3. 测试环境:Visual Studio 2019

二、代码展示

char ** buildArray(int* target, int targetSize, int n, int* returnSize){
    char **ans =(char**)calloc(2*n,sizeof(char*));//push+pop最多2n次
    int left = 0, cur =0;//left保存上一个元素,cur保存当前元素
    for(int i=0;i<targetSize;i++){//遍历target数组的每一个数
        for(int j=left;j<target[i]-1;j++){//到target[i]之前需要进行的操作次数,push+pop
            ans[cur]=(char*)calloc(5,sizeof(char));
            sprintf(ans[cur++],"Push");//一个操作入栈,cur++
            ans[cur]=(char*)calloc(4,sizeof(char));
            sprintf(ans[cur++],"Pop");
        }
        ans[cur]=(char*)calloc(5,sizeof(char));//轮到target[i]被push
        sprintf(ans[cur++],"Push");
        left = target[i];
    }
    *returnSize =cur;
    return ans;
}

三、思路分析

  • 数组严格递增,且只包含1-n之间的数字。
  1. 为了知道Push和Pop的次数,我们需要遍历target。声明left保存前一个数,cur保存push的次数+pop的次数。
  2. left从(前一个数)开始,一直遍历到(当前的数-1),这中间走过的长度,就是需要push+pop的次数。当然,前一个数可能=当前的数-1,表示他们在数字大小上相邻,比如2和3,6和7,等等。此时,跳过push+pop,直接执行一次push,相当于push了当前的数。
  3. 每次循环的最后,让left = 当前的数,那么在下一次循环,left就是前一个数了。

四、代码分析

  • 最后让*returnSize = cur,返回值大小 = pop的次数+push的次数
  • 看注释~

五、AC

AC

六、复杂度分析

  1. 时间复杂度:O(n) ,n是输入整数的大小,如果target数组最大值=n,push的次数为n,所以嵌套循环的时间复杂度是O(n),也是最坏时间复杂度。
  2. 空间复杂度:O(1),除若干变量使用的常量空间,没有使用额外的线性空间。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清墨韵染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值