1. 程式人生 > 資訊 >螞蟻、騰訊的“NFT”字樣全部消失,更名為“數字藏品”

螞蟻、騰訊的“NFT”字樣全部消失,更名為“數字藏品”

問題描述:

給你兩個 沒有重複元素 的陣列nums1nums2,其中nums1nums2的子集。

請你找出 nums1中每個元素在nums2中的下一個比其大的值。

nums1中數字x的下一個更大元素是指xnums2中對應位置的右邊的第一個比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;
}