給定兩個 沒有重複元素 的陣列 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每個元素在nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 -1。
參考官方題解
大致思路:陣列1是陣列2的子集,遍歷一遍陣列2,將所有元素的下乙個更大元素儲存在乙個雜湊表之中,再遍歷陣列1,按陣列1的元素順序將下乙個更大元素讀取到另乙個陣列上。得到陣列2每個元素的下乙個更大元素:將當前指向的元素與棧頂元素比較,若棧頂元素小於當前指向的陣列2的元素,則將棧頂元素出棧,此時指向的陣列2的元素則是其下乙個更大元素,一直比較到棧中的元素沒有比當前指向陣列2的元素小為止,將當前指向元素入棧,指標指向下乙個陣列2中的元素。如此迴圈,直到遍歷完陣列2中的元素,此時棧中剩下的元素皆無下乙個更大元素。
c語言實現
#define maxsize 1000
typedef
struct
hashmap;
hashmap*
inithashmap
(void
)//建立並初始化雜湊表
void
writehash
(hashmap* h,
int key,
int nextmax)
//寫入新的雜湊表項
h[p]
.write=1;
h[p]
.key=key;
h[p]
.nextmax=nextmax;
return;}
intreadhash
(hashmap* h,
int key)
//讀取對應鍵值的雜湊錶值
return h[p]
.nextmax;
}void
destroy
(hashmap* h)
int*
nextgreaterelement
(int
* nums1,
int nums1size,
int* nums2,
int nums2size,
int* returnsize)
stack[
++top]
=nums2[i]
;//當前值入棧
}//將剩餘的元素寫入雜湊表,剩餘元素沒有下乙個更大元素
while
(top>-1
)//讀取雜湊表的值如陣列
for(
int i=
0;i)free
(stack)
;destroy
(hm)
;return r_array;
}
496 下乙個更大元素
給定兩個沒有重複元素的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 1。...
496 下乙個更大元素
給定兩個沒有重複元素的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 1。...
496 下乙個更大元素 I
鏈結 給定兩個沒有重複元素的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出...