下一个更大元素001

1、描述

496给定两个 没有重复元素 的数组 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。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2、关键字

两个数组、

3、思路

两层循环暴力求解,在外一层的for语句中定位每一个元素,然后通过下标变量i来定位第二个数组中相同元素的位置,然后再往后边去一个,比较一下

单调栈,维护一个从上到下单调不减栈

4、notes

二层循环的话就第一层用for语句,内层用for循环可能会清晰一些

5、复杂度

时间:O(N2)平方
空间:O(N)结果集

6、code

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int>res;
        for(auto n:nums1)  // 第一层遍历就用for语句
        {
            int i=0;
            while(nums2[i]!=n) i++;//使用while来寻找在第二个数组中的相等的值的位置正好用i来标记了
            i++;  // 第二个数组的后一个位置
            for(;i<nums2.size();i++)  // 第一个分句可以省了
            {
                if(n<nums2[i])  //如果小于就直接把结果填进去
                {
                    res.push_back(nums2[i]);
                    break;
                }
            }
            if(i==nums2.size())  // 最后找到最后没找到就进去-1
            res.push_back(-1);
        }
        return res;
    }
};

6、2单调栈+hash映射

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int>res;  // 定义结果集
        unordered_map<int,int>mp;  //hash映射
        stack<int>st;  //单调栈
        for(int n:nums2)  // 遍历整个nums2通过单调栈,构造hash映射
        {
            while(!st.empty()&& st.top()<n)  // 栈非空时候,且新元素比栈顶元素更大,
            {
                mp[st.top()]=n;  // 把栈顶元素构成一个 键值对 存起来
                st.pop();  // 当前已经找到了栈顶元素的最近大值,就出栈
            }
            st.push(n);  // 把当前元素压栈
        }

        while(!st.empty())  // 把剩下的没有更高的值赋值 -1
        {
            mp[st.top()]=-1;
            st.pop();
        }
        for(auto tem:nums1)  // 遍历输出结果
        {
            res.push_back(mp[tem]);
        }
    return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java 中实现冒泡排序的基本步骤如下: 1. 定义一个 int 类型的数组,并为其赋初值。 2. 使用 for 循环嵌套,外层循环控制比较轮数,内层循环控制每轮比较的次数。 3. 比较相邻两个数的大小,如果前一个数大于后一个数,就交换两个数的位置。 4. 每轮比较完成后,都要把最大的数放到最后面。 5. 在比较完所有数之后,就完成了冒泡排序。 下面是使用 Java 实现冒泡排序的示例代码: ``` public class BubbleSort { public static void main(String[] args) { // 定义数组 int[] arr = {5, 3, 8, 6, 4}; // 冒泡排序 for (int i = 0; i < arr.length - 1; i++) { // 外层循环控制比较轮数 for (int j = 0; j < arr.length - 1 - i; j++) { // 内层循环控制每轮比较的次数 if (arr[j] > arr[j + 1]) { // 比较相邻两个数的大小 // 交换两个数的位置 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } // 输出排序后的数组 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } } ``` 输出结果为: ``` 3 4 5 6 8 ``` 希望这些信息能够帮助你。如果你还有 ### 回答2: 冒泡排序是一种简单的排序算法,它通过重复地交换相邻元素的位置来将一个数组或列表按照升序或降序排列。 以下是使用Java实现冒泡排序的代码: ```java public void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换两个相邻元素的位置 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 上述代码中,`bubbleSort`方法接受一个整数数组作为参数,并使用嵌套循环遍历数组来比较相邻元素的大小。如果前一个元素大于后一个元素,则交换它们的位置。通过多次迭代,较大(或较小)的元素将不断“浮动”到数组的末尾,从而实现排序目的。 冒泡排序的时间复杂度为O(n^2),其中n是数组的长度。对于小规模的数组,冒泡排序是一个简单且有效的排序算法。然而,对于大规模的数据集,冒泡排序的性能则会相对较差,可以考虑使用其他更高效的排序算法。 ### 回答3: 冒泡排序是一种简单的排序算法,它通过多次比较相邻的元素并交换位置来实现排序。下面是使用Java实现冒泡排序的代码: ``` public class BubbleSort { public static void main(String[] args) { int[] arr = {5, 9, 3, 1, 8, 6, 2, 4, 7}; // 待排序的数组 bubbleSort(arr); // 调用冒泡排序方法 // 输出排序结果 for (int num : arr) { System.out.print(num + " "); } } public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-1-i; j++) { if (arr[j] > arr[j+1]) { // 交换相邻两个元素的位置 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } } ``` 以上代码中,我们首先定义了一个待排序的数组 `arr`,然后调用了 `bubbleSort` 方法对数组进行排序。`bubbleSort` 方法通过两层嵌套循环来进行多次的比较和交换,直到数组中的所有元素都按照从小到大的顺序排列。内层循环每次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。外层循环控制比较和交换的次数,每经过一轮外层循环,最大的元素就会被交换到正确的位置上。最后,我们通过遍历排序后的数组来输出排序结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值