給定兩個沒有重複元素的陣列 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。
nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出-1。
示例 1:
輸入: nums1 = [4,1,2], nums2 = [1,3,4,2].
輸出: [-1,3,-1]
解釋:對於num1中的數字4,你無法在第二個陣列中找到下乙個更大的數字,因此輸出 -1。
對於num1中的數字1,第二個陣列中數字1右邊的下乙個較大數字是 3。
對於num1中的數字2,第二個陣列中沒有下乙個更大的數字,因此輸出 -1。
示例 2:
輸入: nums1 = [2,4], nums2 = [1,2,3,4].
輸出: [3,-1]
解釋:對於num1中的數字2,第二個陣列中的下乙個較大數字是3。
對於num1中的數字4,第二個陣列中沒有下乙個更大的數字,因此輸出 -1。
注意:nums1和nums2中所有元素是唯一的。
nums1和nums2 的陣列大小都不超過1000。
首先在nums陣列裡面找到findnums每個元素的對應位置,找不到則直接存入-1;
找到之後從下乙個元素開始(對應題目描述的右邊),尋找比此元素大的元素下標,找到則存入下標所指向的元素。
否則就存入-1.
這個應該是最笨的方法了。。
假設findnums和nums長度分別為m和n,則此演算法時間複雜度為o(mn),空間複雜度為o(1).
這道題其實就是求nums陣列每個元素右邊第乙個比它大的元素,不存在就是-1。
所以初始化乙個map,大小與nums.size()相同,記錄nums每個元素以及它右邊第乙個比他大的元素。
如何去尋找呢?
可以遍歷nums陣列,用棧的棧頂來記錄每個元素temp右邊的元素,直到找到乙個比當前元素temp大的元素,將temp與該元素一起壓入map。
如果找不到比temp大的元素,那麼將temp與-1一起壓入map。
當map初始化完畢後,就可以開始遍歷findnums陣列了。
根據findnums的元素值找到其在map中的對映,將對映依次加入vector容器即可。
假設findnums和nums長度為m和n,則時間複雜度為o(max(m,n)),空間複雜度為o(n),空間換時間。
舉例
對於例1中的nums=,先遍歷nums來初始化map。
1)對於1,壓入3,3比1大,1右邊第乙個比它大的數字找到,map[1]=3;
2)對於3,壓入4,4比3大,3右邊第乙個比它大的數字找到,map[3]=4;
3)對於4,壓入2,2比4小,2出棧。nums陣列結束,4右邊不存在比它大的數字,map[4]=-1;
4)對於2,2已經是nums最後乙個數字,2右邊不存在比它大的數字,map[2]=-1.
map初始化完成,接下來遍歷findnums=。
1)map[findnums[0]]=map[4]=-1,-1加入vector
2)map[findnums[1]]=map[1]=3,3加入vector
3)map[findnums[2]]=map[2]=-1,-1加入vector
最後vector的結果就是,返回這個vector即可。
class solution
//棧空存入元素
m_stack.push(nums[index]);
m_map[nums[index]]=-1;
}//遍歷findnums
1、496. 下乙個更大元素 i 收藏
leetcode第31題下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
leetcode 第31題 下乙個排列
實現獲取 下乙個排列 的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須 原地 修改,只允許使用額外常數空間。示例 1 輸入 nums 1,2,3 輸出 1,3,2 示例 2 輸入 nums 3,2,1 輸...
LeetCode每日一題 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...