LeetCode第496題 下乙個更大元素 I

2021-09-10 07:19:59 字數 2058 閱讀 6091

給定兩個沒有重複元素的陣列 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...