1 int* nextGreaterElements(int* nums, int numsSize, int* returnSize) { 2 int* stack=malloc(sizeof(int)*numsSize); 3 int* res=malloc(sizeof(int)*numsSize); 4 int top=-1; 5 *returnSize=numsSize; 6 for(int i=0;i<numsSize;i++) res[i]=-1; 7 8 for(int i=0;i<2*numsSize;i++){ 9 int num=nums[i%numsSize]; 10 while(top!=-1 && nums[stack[top]]<num){ 11 res[stack[top]]=num; 12 top--; 13 } 14 if(i<numsSize) stack[++top]=i; 15 } 16 return res; 17 }
1.如何表示循环 :i%numsSize 和 i<2*numsSize;
2.在遍历了一次nums之后,stack数组中存的全是没有找到greater的数,那么只需要从头再开始比较,例如nums[0]和stack中的比较,如果nums[0] greater的话 stack.top对应的res更新,然后pop出去即可。因为只要是小于nums[0]的stack均会在while中被循环更新res
3.唯一不同的是,stack不需要再push进数字了,因为第二次循环的任务就是消灭那些stack中存留的数字。