https://www.hackerrank.com/challenges/equal-stacks
对于这个问题,我试图在c中实现堆栈数据结构。但是我使用以下代码在某些情况下会超时:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
struct Stack{
int top;
int size;
int sum;
int* arr;
};
struct Stack* createStack(int size){
struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
stack->size=size;
stack->top=-1;
stack->sum=0;
stack->arr = (int*)malloc(sizeof(int)*size);
return stack;
}
int isempty(struct Stack* stack){
if(stack->top==-1)
return 1;
return 0;
}
void push(struct Stack* stack,int term){
stack->top++;
stack->arr[stack->top]=term;
stack->sum+=term;
}
void pop(struct Stack* stack){
if(isempty(stack)==0){
stack->sum-=stack->arr[stack->top];
stack->top--;
}
}
int main(){
int size1,size2,size3;
scanf("%d %d %d",&size1,&size2,&size3);
int arr1[size1];
for(int i=0;i<size1;i++)
scanf("%d",&arr1[i]);
struct Stack* stack1 = createStack(size1);
for(int i=size1-1;i>=0;i--)
push(stack1,arr1[i]);
int arr2[size2];
for(int i=0;i<size2;i++)
scanf("%d",&arr2[i]);
struct Stack* stack2 = createStack(size2);
for(int i=size2-1;i>=0;i--)
push(stack2,arr2[i]);
int arr3[size3];
for(int i=0;i<size3;i++)
scanf("%d",&arr3[i]);
struct Stack* stack3 = createStack(size3);
for(int i=size3-1;i>=0;i--)
push(stack3,arr3[i]);
while(stack1->sum!=stack2->sum || stack2->sum!=stack3->sum){
if(stack1->sum > stack2->sum && stack1->sum > stack3->sum)
pop(stack1);
if(stack2->sum > stack1->sum && stack2->sum > stack3->sum)
pop(stack2);
if(stack3->sum > stack2->sum && stack3->sum > stack1->sum)
pop(stack3);
}
printf("%d\n",stack1->sum);
}
有人建议只使用堆栈数据结构(最好是C)的更好的方法吗?
答案 0 :(得分:2)
您可以通过确定哪个堆栈具有最高总和,然后从该堆栈弹出直到其总和等于或小于最低总和来加快速度。
查找具有最高和最低总和的堆栈的代码可能如下所示
struct Stack *high = (stack1->sum > stack2->sum) ? stack1 : stack2;
struct Stack *low = (high == stack1) ? stack2 : stack1;
if ( stack3->sum > high->sum )
high = stack3;
else if ( stack3->sum < low->sum )
low = stack3;
然后减少最高总和的代码就像这样
while ( high->sum > low->sum )
pop( high );
答案 1 :(得分:1)
您可能超出时间限制的原因是因为您的while循环永远不会结束
a)任何堆栈都变空。你应该在while循环条件中添加该检查,没有任何堆栈是空的,然后输出所有三个堆栈的最小总和。
b)可能存在高度为20,10,10的情况,在这种情况下,您的代码将如何工作?