import java.util.Stack;
/**
<p><code>nums1</code> 中数字 <code>x</code> 的 <strong>下一个更大元素</strong> 是指 <code>x</code> 在 <code>nums2</code> 中对应位置 <strong>右侧</strong> 的 <strong>第一个</strong> 比 <code>x</code><strong> </strong>大的元素。</p>
<p>给你两个<strong> 没有重复元素</strong> 的数组 <code>nums1</code> 和 <code>nums2</code> ,下标从 <strong>0</strong> 开始计数,其中<code>nums1</code> 是 <code>nums2</code> 的子集。</p>
<p>对于每个 <code>0 <= i < nums1.length</code> ,找出满足 <code>nums1[i] == nums2[j]</code> 的下标 <code>j</code> ,并且在 <code>nums2</code> 确定 <code>nums2[j]</code> 的 <strong>下一个更大元素</strong> 。如果不存在下一个更大元素,那么本次查询的答案是 <code>-1</code> 。</p>
<p>返回一个长度为 <code>nums1.length</code> 的数组<em> </em><code>ans</code><em> </em>作为答案,满足<em> </em><code>ans[i]</code><em> </em>是如上所述的 <strong>下一个更大元素</strong> 。</p>
<p> </p>
<p><strong>示例 1:</strong></p>
<pre>
<strong>输入:</strong>nums1 = [4,1,2], nums2 = [1,3,4,2].
<strong>输出:</strong>[-1,3,-1]
<strong>解释:</strong>nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,<strong>4</strong>,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [<em><strong>1</strong></em>,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,<em><strong>2</strong></em>]。不存在下一个更大元素,所以答案是 -1 。</pre>
<p><strong>示例 2:</strong></p>
<pre>
<strong>输入:</strong>nums1 = [2,4], nums2 = [1,2,3,4].
<strong>输出:</strong>[3,-1]
<strong>解释:</strong>nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,<em><strong>2</strong></em>,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,<em><strong>4</strong></em>]。不存在下一个更大元素,所以答案是 -1 。
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 <= nums1.length <= nums2.length <= 1000</code></li>
<li><code>0 <= nums1[i], nums2[i] <= 10<sup>4</sup></code></li>
<li><code>nums1</code>和<code>nums2</code>中所有整数 <strong>互不相同</strong></li>
<li><code>nums1</code> 中的所有整数同样出现在 <code>nums2</code> 中</li>
</ul>
<p> </p>
<p><strong>进阶:</strong>你可以设计一个时间复杂度为 <code>O(nums1.length + nums2.length)</code> 的解决方案吗?</p>
<div><div>Related Topics</div><div><li>栈</li><li>数组</li><li>哈希表</li><li>单调栈</li></div></div><br><div><li>???? 697</li><li>???? 0</li></div>
*/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] res = new int[nums2.length];
Stack<Integer> s = new Stack<>();
for (int i = nums2.length-1; i >= 0; i--) {
while (!s.isEmpty() && s.peek() <= nums2[i]) {
s.pop();
}
res[i] = (s.isEmpty() ||nums2[i] >= s.peek()) ?-1: s.peek() ;
s.push(nums2[i]);
}
//转化一下n1 对应值在 n2中的位置
int[] pos = new int[nums1.length];
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
if(nums1[i]==nums2[j]){
pos[i]=j;
continue;
}
}
}
for (int i = 0; i < pos.length; i++) {
pos[i] =res[pos[i]];
}
return pos;
}
}
//leetcode submit region end(Prohibit modification and deletion)
不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!