问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4026 访问。

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].

输出: [-1,3,-1]

解释:

    对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。

    对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。

    对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。

输入: nums1 = [2,4], nums2 = [1,2,3,4].

输出: [3,-1]

解释:

    对于num1中的数字2,第二个数组中的下一个较大数字是3。

    对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。

注意:

  • nums1和nums2中所有元素是唯一的。
  • nums1和nums2 的数组大小都不超过1000。

You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of nums2. Find all the next greater numbers for nums1's elements in the corresponding places of nums2.

The Next Greater Number of a number x in nums1 is the first greater number to its right in nums2. If it does not exist, output -1 for this number.

Input: nums1 = [4,1,2], nums2 = [1,3,4,2].

Output: [-1,3,-1]

Explanation:

    For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1.

    For number 1 in the first array, the next greater number for it in the second array is 3.

    For number 2 in the first array, there is no next greater number for it in the second array, so output -1.

Input: nums1 = [2,4], nums2 = [1,2,3,4].

Output: [3,-1]

Explanation:

    For number 2 in the first array, the next greater number for it in the second array is 3.

    For number 4 in the first array, there is no next greater number for it in the second array, so output -1.

Note:

  • All elements in nums1 and nums2 are unique.
  • The length of both nums1 and nums2 would not exceed 1000.

示意


示例

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4026 访问。

public class Program {

    public static void Main(string[] args) {
var findNums = new int[] { 4, 1, 2 };
var nums = new int[] { 1, 3, 4, 2 }; var res = NextGreaterElement(findNums, nums);
ShowArray(res); findNums = new int[] { 2, 4 };
nums = new int[] { 1, 2, 3, 4 }; res = NextGreaterElement2(findNums, nums);
ShowArray(res); Console.ReadKey();
} private static void ShowArray(int[] array) {
foreach(var num in array) {
Console.Write($"{num} ");
}
Console.WriteLine();
} public static int[] NextGreaterElement(int[] findNums, int[] nums) {
var res = new List<int>();
var j = 0;
var flag = false;
var list = nums.ToList();
for(var i = 0; i < findNums.Length; i++) {
j = list.IndexOf(findNums[i]) + 1;
if(j == nums.Length) {
res.Add(-1);
continue;
}
flag = false;
while(j < nums.Length) {
if(nums[j] > findNums[i]) {
res.Add(nums[j]);
flag = true;
break;
}
j++;
}
if(!flag) res.Add(-1);
}
return res.ToArray();
} public static int[] NextGreaterElement2(int[] findNums, int[] nums) {
//栈,请参考上方示意图
var dic = new Dictionary<int, int>();
var stack = new Stack<int>();
for(var i = 0; i < nums.Length; i++) {
dic[nums[i]] = -1;
while(stack.Any() && nums[i] > stack.Peek()) {
dic[stack.Pop()] = nums[i];
}
stack.Push(nums[i]);
}
var res = new List<int>();
foreach(var num in findNums) {
res.Add(dic[num]);
}
return res.ToArray();
} }

以上给出2种算法实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4026 访问。

-1 3 -1
3 -1

分析:

显而易见,NextGreaterElement 的时间复杂度为:  ,NextGreaterElement2 的时间复杂度为:  。

C#LeetCode刷题之#496-下一个更大元素 I(Next Greater Element I)的更多相关文章

  1. LeetCode 496. 下一个更大元素 I(Next Greater Element I) 35

    496. 下一个更大元素 I 496. Next Greater Element I 题目描述 给定两个没有重复元素的数组 nums1 和 nums2,其中 nums1 是 nums2 的子集.找到  ...

  2. LeetCode 556. 下一个更大元素 III(Next Greater Element III)

    556. 下一个更大元素 III 556. Next Greater Element III 题目描述 给定一个 32 位正整数 n,你需要找到最小的 32 位整数,其与 n 中存在的位数完全相同,并 ...

  3. LeetCode 503. 下一个更大元素 II(Next Greater Element II)

    503. 下一个更大元素 II 503. Next Greater Element II 题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 ...

  4. [Swift]LeetCode496. 下一个更大元素 I | Next Greater Element I

    You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of n ...

  5. [Swift]LeetCode503. 下一个更大元素 II | Next Greater Element II

    Given a circular array (the next element of the last element is the first element of the array), pri ...

  6. [Swift]LeetCode556. 下一个更大元素 III | Next Greater Element III

    Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...

  7. Java实现 LeetCode 496 下一个更大元素 I

    496. 下一个更大元素 I 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nu ...

  8. 【LeetCode】496.下一个更大元素I

    496.下一个更大元素I 知识点:栈:HashMap: 题目描述 给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集. 请你找出 nums1 中每个元 ...

  9. 496. 下一个更大元素 I

    496. 下一个更大元素 I 给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. ...

  10. Leetcode---栈系列刷题(python3实现)----#496 下一个更大元素I

    给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...

随机推荐

  1. ToText Basic 语法和 Crystal 语法

    本文转自http://www.softwelt.com/Know/KnowDetail-2236860.html ToText 和 CStr 是等价函数. 重载 ToText (x) ToText ( ...

  2. Python Ethical Hacking - TROJANS Analysis(3)

    BYPASSING ANTI-VIRUS PROGRAMS AV programs detect viruses based on: 1. Code - compare files to huge d ...

  3. Python Ethical Hacking - KEYLOGGER(3)

    Object-Oriented Programming Keylogger Classes Way of modeling program(blueprint). Logically group fu ...

  4. kubernetes系列(十) - 通过Ingress实现七层代理

    1. Ingress入门 1.1 Ingress简介 1.2 原理和组成部分 1.3 资料信息 2. Ingress部署的几种方式 2.1 前言 2.1 Deployment+LoadBalancer ...

  5. 集训作业 洛谷P1443 马的遍历

    这个题是个搜索,而且有是最少的步数,肯定就是广搜啦,不知道为什么的同学先去学习一下广搜吧. 养成好习惯,看见最少步数就去想想广搜(只是我自己觉得) 竟然这个题可以如此顺畅的想到广搜,感觉不难啊,但还有 ...

  6. Eclipse默认快捷键说明

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...

  7. vue : 自定义脚手架提示

    做项目做烦了就想找点乐子. 比如,我们可以自定义脚手架提示.  webpack.dev.conf.js  54-78 行 module.exports = new Promise((resolve, ...

  8. css属性inline-block的应用

    1. 让两个块级元素处于同一行 2. 需要元素撑开边框的时候

  9. python-study-文件操作

    # 一.文件操作的作用 :读取内容.写入内容.备份内容.... # 文件的基本操作,文件操作包含:打开.关闭.读.写.复制.... # 打开 读写 关闭 # 文件备份 # 文件和文件夹的操作 # 总结 ...

  10. 国外的非常好的开发提问回答的网站https://stackoverflow.com/questions

    https://stackoverflow.com/questions 可以进行搜索,在页面顶部,有搜索输入框