LeetCode刷题笔记-496.下一个更大元素 I
C代码
struct hmap_st {
int key;
int value;
int index;
UT_hash_handle hh;
} ;
void push ( int * stack, int * top, int val) {
( * top) ++ ;
stack[ ( * top) ] = val;
}
int pop ( int * stack, int * top) {
int ret = - 1 ;
if ( * top < 0 )
return ret;
ret = stack[ ( * top) ] ;
( * top) -- ;
return ret;
}
int * nextGreaterElement ( int * nums1, int nums1Size, int * nums2, int nums2Size, int * returnSize) {
struct hmap_st * hmap = NULL ;
struct hmap_st * t = NULL ;
struct hmap_st * tmp = NULL ;
int stack[ 1024 ] = { 0 } ;
int top = - 1 ;
int i;
int tp;
int * ret = NULL ;
* returnSize = nums1Size;
ret = calloc ( nums1Size, sizeof ( int ) ) ;
for ( i = 0 ; i < nums1Size; i++ ) {
t = calloc ( 1 , sizeof ( * t) ) ;
t-> key = nums1[ i] ;
t-> value = - 1 ;
t-> index = i;
HASH_ADD_INT ( hmap, key, t) ;
}
for ( i = nums2Size - 1 ; i >= 0 ; i-- ) {
if ( top == - 1 ) {
push ( stack, & top, nums2[ i] ) ;
continue ;
}
while ( nums2[ i] > stack[ top] ) {
tp = pop ( stack, & top) ;
if ( top == - 1 )
break ;
HASH_FIND_INT ( hmap, & tp, t) ;
if ( t == NULL )
break ;
t-> value = stack[ top] ;
}
push ( stack, & top, nums2[ i] ) ;
}
for ( i = top; i > 0 ; i-- ) {
HASH_FIND_INT ( hmap, & stack[ i] , t) ;
if ( t == NULL )
continue ;
t-> value = stack[ i- 1 ] ;
}
HASH_ITER ( hh, hmap, t, tmp) {
ret[ t-> index] = t-> value;
}
return ret;
}
注意点
主题思路右边最大的第一个,需要使用到单调栈; 注意最后遍历栈的处理,如果遇到不在num1[]
的元素需要continue
而不是break
停止了后面的赋值; 注意处理stack
弹出的元素避免遗漏场景;
结果