496. 下一个更大元素 I【我亦无他唯手熟尔】

简介: 496. 下一个更大元素 I【我亦无他唯手熟尔】

496. 下一个更大元素 I

给你两个 没有重复元素 的数组 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 。
提示:
1 <= nums1.length <= nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 104
nums1和nums2中所有整数 互不相同
nums1 中的所有整数同样出现在 nums2 中
进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

我的答案

首先,结果数组的长度和nums1的长度一样
思路一
遍历nums1数组
  依次遍历nums2数组中找到对应的位置,做个标记flag=1
  在之后的遍历中找到第一个比它大的值,添加到结果数组中,break
  nums完全遍历,说明没有找到,把-1添加到结果数组中
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] result=new int[nums1.length];
        for (int i = 0; i < nums1.length; i++) {
            int flag=0;
            int j;
            for (j=0;j<nums2.length;j++){
                if (nums2[j]==nums1[i]){
                    flag=1;
                }
                if (nums2[j]>nums1[i]&&flag==1){
                    result[i]=nums2[j];
                    break;
                }
            }
            if (j==nums2.length){
                result[i]=-1;
            }
        }
        return result;
    }
}
首先,结果数组的长度和nums1的长度一样
思路一是从左到右遍历nums2,也可以从右至左
思路二
遍历nums1数组
  依次从右至左遍历nums2,找到比它大的值赋给bigger
  数组中找到对应的位置就break
把bigger添加到结果数组中
如果没有break跳出,即完全遍历nums2数组
把bigger初始值-1添加到结果数组中
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] result=new int[nums1.length];
        for (int i = 0; i < nums1.length; i++) {
            int j;
            int bigger=-1;
            for (j=nums2.length-1;j>0;j--){
                if (nums2[j]==nums1[i]){
                    break;
                }
                if (nums2[j]>nums1[i]){
                    bigger=nums2[j];
                }
            }
            result[i]=bigger;
        }
        return result;
    }
}
相关文章
|
算法 索引
|
4月前
|
存储 搜索推荐 Serverless
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
42 1
|
7月前
|
存储 算法 PHP
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
45 1
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
1446. 连续字符【我亦无他唯手熟尔】
1446. 连续字符【我亦无他唯手熟尔】
54 0
598. 范围求和 II【我亦无他唯手熟尔】
598. 范围求和 II【我亦无他唯手熟尔】
64 0
869. 重新排序得到 2 的幂【我亦无他唯手熟尔】
869. 重新排序得到 2 的幂【我亦无他唯手熟尔】
48 0
|
算法
268. 丢失的数字【我亦无他唯手熟尔】
268. 丢失的数字【我亦无他唯手熟尔】
53 0
|
算法
独一无二的解谜:寻找只出现一次的元素
在这篇文章中,我们将解析题目 "只出现一次的元素",要求在给定的非空整数数组中找出只出现一次的元素。我们将会探讨如何设计一个满足线性时间复杂度和常数额外空间限制的算法,揭开这个问题的神秘面纱。
91 0
1929. 数组串联【我亦无他唯手熟尔】
1929. 数组串联【我亦无他唯手熟尔】
55 0
用试题这把“剑“帮你破除指针与数组之间的那些猫腻
用试题这把“剑“帮你破除指针与数组之间的那些猫腻
64 0

热门文章

最新文章