LeetCode演算法題-Next Greater Element I(Java實現)
這是悅樂書的第244次更新,第257篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第111題(順位題號是496)。你有兩個陣列(沒有重複)nums1和nums2,其中nums1的元素是nums2的子集。在nums2的相應位置找到nums1元素的所有下一個更大的數字。nums1中的數字x的下一個更大數字是nums2中右邊第一個更大的數字。如果它不存在,則輸出該數字的-1。例如:
輸入:nums1 = [4,1,2],nums2 = [1,3,4,2]。
輸出:[-1,3,-1]
說明:對於第一個陣列中的數字4,在第二個陣列中找不到下一個更大的數字,因此輸出-1。對於第一個陣列中的數字1,第二個陣列中的下一個更大數字是3。對於第一個陣列中的數字2,第二個陣列中沒有下一個更大的數字,因此輸出-1。
輸入:nums1 = [2,4],nums2 = [1,2,3,4]。
輸出:[3,-1]
說明:對於第一個陣列中的數字2,第二個陣列中的下一個更大數字是3。對於第一個陣列中的數字4,第二個陣列中沒有下一個更大的數字,因此輸出-1。
注意:
nums1和nums2中的所有元素都是唯一的。
nums1和nums2的長度不會超過1000。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
暴力解法。使用兩層迴圈,先找到nums1的元素在nums2中的對應元素,然後從nums2中找到的元素的下一位往右開始判斷,找到比當前元素大的元素,找得到就將其作為結果陣列的元素新增進去,否則就將-1新增進結果陣列。
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
for (int i=0; i<nums1.length; i++) {
int j = 0, k = 0;
for (; j<nums2.length; j++) {
if (nums1[i] == nums2[j]) {
break;
}
}
for (k = j+1; k<nums2.length; k++) {
if (nums2[k] > nums2[j]) {
result[i] = nums2[k];
break;
}
}
if (k == nums2.length) {
result[i] = -1;
}
}
return result;
}
03 第二種解法
我們可以將第一種方法進行優化,將nums2中的元素作為key、索引作為value存入HashMap,在原來第一種解法中每次通過迴圈來定位nums2中的索引位置,換成了通過key查詢value的對映,獲取到索引後,從索引後一位開始依次尋找比nums1的當前元素大的數字,找得到就替換已經設值為-1的結果陣列的元素值。
public int[] nextGreaterElement2(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i<nums2.length; i++) {
map.put(nums2[i], i);
}
for (int j=0; j<nums1.length; j++) {
result[j] = -1;
int index = map.get(nums1[j]);
for (int k = index + 1; k<nums2.length; k++) {
if (nums2[k] > nums1[j]) {
result[j] = nums2[k];
break;
}
}
}
return result;
}
04 第三種解法
使用HashMap和棧。在第二種解法中我們使用HashMap存的是nums2的值、索引,在此解法中,我們使用HashMap存的是,如果nums2的當前元素存在右邊最大數,上一個元素為key,當前元素為value。
在遍歷nums2中的元素時,如果棧不為空,並且當前棧頂的值小於當前元素,即nums2的前一個元素存在右邊最大數,此時,我們需要將棧頂的元素作為key,當前元素作為value,存入HashMap中,同時,要將棧頂的元素移除,此操作是迴圈執行的。最後我們再將nums2的當前元素存入stack中。
接著,我們要開始處理nums1的資料了,遍歷其中的元素,如果能夠在HashMap中找到對應的值,就取其value作為結果陣列的元素值,否則取-1作為預設值。
public int[] nextGreaterElement3(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Stack<Integer> stack = new Stack<Integer>();
for (int num : nums2) {
while (!stack.isEmpty() && stack.peek() < num) {
map.put(stack.pop(), num);
}
stack.push(num);
}
for (int i=0; i<nums1.length; i++) {
result[i] = map.getOrDefault(nums1[i], -1);
}
return result;
}
05 小結
演算法專題目前已日更超過三個月,演算法題文章111+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!
相關文章
- [Leetcode學習-c++&java]Next Greater Element I ~ IIILeetCodeC++Java
- LeetCode演算法題-Number of Boomerangs(Java實現)LeetCode演算法OOMJava
- Java實現-揹包問題IJava
- Remove Element leetcode javaREMLeetCodeJava
- LeetCode 之 JavaScript 解答第169題 —— 求眾數 I(Majority Element)LeetCodeJavaScript
- Next Permutation leetcode javaLeetCodeJava
- leetcode刷題--Majority ElementLeetCode
- LeetCode之Convert BST to Greater Tree(Kotlin)LeetCodeKotlin
- [2]十道演算法題【Java實現】演算法Java
- 【演算法資料結構Java實現】Java實現動態規劃(揹包問題)演算法資料結構Java動態規劃
- KMP演算法的next、next value陣列程式碼實現及POJ3461KMP演算法陣列
- 蟻群演算法實現TSP(旅行商)問題(java)演算法Java
- 轉:八皇后問題 java實現,演算法兩則Java演算法
- java中i=i++的問題Java
- leetcode Remove ElementLeetCodeREM
- 排序演算法 Java實現排序演算法Java
- 排序演算法Java實現排序演算法Java
- java實現Bitmap演算法Java演算法
- KMP演算法 Java實現KMP演算法Java
- LeetCode題目:39. 組合總和 解題思路及Java實現LeetCodeJava
- 【雜談】Java I/O的底層實現Java
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 蟻群演算法java實現以及TSP問題蟻群演算法求解演算法Java
- LeetCode演算法題LeetCode演算法
- JAVA實現DIJKSTRA演算法Java演算法
- 組合演算法java實現演算法Java
- [leetcode]remove-elementLeetCodeREM
- Leetcode-Remove ElementLeetCodeREM
- Find Peak element leetcodeLeetCode
- Populating Next Right Pointers in Each Node leetcode javaLeetCodeJava
- Vue+Element UI實現CRUDVueUI
- mysql實現nextVal功能MySql
- 【LeetCode-面試演算法經典-Java實現】【139-Word Break(單詞拆分)】LeetCode面試演算法Java
- 排序演算法-Java實現快速排序演算法排序演算法Java
- Java實現 LeetCode 35 搜尋插入位置JavaLeetCode
- leetcode演算法題解(Java版)-3-廣搜+HashMapLeetCode演算法JavaHashMap
- Populating Next Right Pointers in Each Node II leetcode javaLeetCodeJava
- java氣泡排序演算法實現Java排序演算法