螞蟻、騰訊的“NFT”字樣全部消失,更名為“數字藏品”
阿新 • • 發佈:2021-10-23
問題描述:
給你兩個 沒有重複元素 的陣列nums1
和nums2
,其中nums1
是nums2
的子集。
請你找出 nums1
中每個元素在nums2
中的下一個比其大的值。
nums1
中數字x
的下一個更大元素是指x
在nums2
中對應位置的右邊的第一個比x
大的元素。如果不存在,對應位置輸出 -1
。
解決方案(參考自三葉小姐姐)
1.暴力搜尋
解題思路:先找到nums2陣列中跟nums1該元素相等元素的下標
從該元素向後搜尋直到找到比該元素大的數,找不到即返回-1
程式碼實現(Java):
classSolution{ public int[] nextGreaterElement(int[] nums1, int[] nums2) { int n =nums1.length;
int m = nums2.length;
int []result = new int[n];
for(int i=0;i<n;i++){
// 尋找該元素的下標
int j=0;
while (j<m && nums1[i]!=nums2[j]) j++;
// 找到後尋找比該元素大的數
while (j<m && nums2[j]<=nums1[i]) j++;
result[i] =j<m? nums2[j] :-1;
}
return result;
}
}
2.單調棧+雜湊對映
解題思路:構造一個單調棧,通過雜湊對映存入雜湊表
如果棧頂為空說明無所找元素,反之棧頂元素即為所求元素
程式碼實現:
public int[] nextGreaterElement2(int[] nums1, int[] nums2) {
int n = nums1.length;
int m = nums2.length;
Deque<Integer> d = new ArrayDeque<>();
Map<Integer, Integer> map = new HashMap<>();
// 逆序遍歷陣列二構造單調棧 ???此處不明白為何逆序
for (int i = m - 1; i >= 0; i--) {
int x = nums2[i];
// 構造單調遞減棧 棧頂不為空,且棧頂元素小於當前元素時出棧
while (!d.isEmpty() && d.peekLast() <= x) d.pollLast();
map.put(x, d.isEmpty() ? -1 : d.peekLast());
d.addLast(x);
}
// 構造解向量
int[] result = new int[n];
for (int i = 0; i < n; i++) {
result[i] = map.get(nums1[i]);
}
return result;
}