一、环境说明
- 本文是 LeetCode 1441题 : 用栈操作构建数组,使用c语言实现
- 模拟栈
- 测试环境:Visual Studio 2019
二、代码展示
char ** buildArray(int* target, int targetSize, int n, int* returnSize){
char **ans =(char**)calloc(2*n,sizeof(char*));
int left = 0, cur =0;
for(int i=0;i<targetSize;i++){
for(int j=left;j<target[i]-1;j++){
ans[cur]=(char*)calloc(5,sizeof(char));
sprintf(ans[cur++],"Push");
ans[cur]=(char*)calloc(4,sizeof(char));
sprintf(ans[cur++],"Pop");
}
ans[cur]=(char*)calloc(5,sizeof(char));
sprintf(ans[cur++],"Push");
left = target[i];
}
*returnSize =cur;
return ans;
}
三、思路分析
- 为了知道Push和Pop的次数,我们需要遍历target。声明left保存前一个数,cur保存push的次数+pop的次数。
- left从(前一个数)开始,一直遍历到(当前的数-1),这中间走过的长度,就是需要push+pop的次数。当然,前一个数可能=当前的数-1,表示他们在数字大小上相邻,比如2和3,6和7,等等。此时,跳过push+pop,直接执行一次push,相当于push了当前的数。
- 每次循环的最后,让left = 当前的数,那么在下一次循环,left就是前一个数了。
四、代码分析
- 最后让*returnSize = cur,返回值大小 = pop的次数+push的次数
- 看注释~
五、AC
六、复杂度分析
- 时间复杂度:O(n) ,n是输入整数的大小,如果target数组最大值=n,push的次数为n,所以嵌套循环的时间复杂度是O(n),也是最坏时间复杂度。
- 空间复杂度:O(1),除若干变量使用的常量空间,没有使用额外的线性空间。