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; } }