LC739-数组中元素与下一个比它大的元素之间的距离-双重循环/单调栈

题目

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

方法1:双重循环

定义两个指针i,j,若T[j]>T[i], 则输出下标差

注意:因为int是java的基本数据类型,它的默认值是0

class Solution {
    public int[] dailyTemperatures(int[] T) {

        int[] res = new int[T.length];

        for(int i = 0; i < T.length-1; i++){
            for(int j = i+1; j < T.length; j++){
                if(T[i] < T[j]){
                    res[i] = j - i;
                    break;
                }
            }
        }
        return res;
    }
}
方法2:单调栈
  • 若当前数值 大于 栈顶元素对应的数值,则栈顶元素出栈,因为已经找到了距离它最近的 比它大的数字,两数对应的下标差就是应该输出的数
  • 若小于等于,则进栈,形成一个递减栈
class Solution {
    public int[] dailyTemperatures(int[] T) {

        int[] res = new int[T.length];//数组记录的是下标的差值

        Deque<Integer> deque = new LinkedList<Integer>();//单调栈, 若大于栈顶元素则出栈

        for(int i = 0; i < T.length; i++){
            int current = T[i];
            while(!deque.isEmpty() && current>T[deque.peek()]){
                int preIndex = deque.pop();//栈中记录的是数组下标
                res[preIndex]=i-preIndex;
            }
            deque.push(i);
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我能理解你的要求。以下是实现你要求的C++代码: ```c++ #include <iostream> using namespace std; void Ascending(int arr[], int n) { for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (arr[i] > arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } void MergeList(int arr1[], int arr2[], int arr3[], int n) { int i = 0, j = 0, k = 0; while (i < n && j < n) { if (arr1[i] < arr2[j]) { arr3[k++] = arr1[i++]; } else { arr3[k++] = arr2[j++]; } } while (i < n) { arr3[k++] = arr1[i++]; } while (j < n) { arr3[k++] = arr2[j++]; } } int main() { int* La = new int[5]; int* Lb = new int[5]; int* Lc = new int[10]; cout << "请输入La数组的5个元素(1-100):" << endl; for (int i = 0; i < 5; i++) { cin >> La[i]; } cout << "请输入Lb数组的5个元素(1-100):" << endl; for (int i = 0; i < 5; i++) { cin >> Lb[i]; } Ascending(La, 5); Ascending(Lb, 5); MergeList(La, Lb, Lc, 5); cout << "合并后的Lc数组为:" << endl; for (int i = 0; i < 10; i++) { cout << Lc[i] << " "; } cout << endl; delete[] La; delete[] Lb; delete[] Lc; return 0; } ``` 代码解释: 首先,我们使用 `new` 运算符动态分配内存创建了三个数组 `La`、`Lb` 和 `Lc`。 然后,我们使用 `cin` 输入了 `La` 和 `Lb` 两个数组的元素。 接着,我们调用了 `Ascending()` 函数,将 `La` 和 `Lb` 数组元素按照升序排序。 然后,我们调用了 `MergeList()` 函数,将排序后的 `La` 和 `Lb` 数组合并到 `Lc` 数组中。 最后,我们输出了合并后的 `Lc` 数组元素,并使用 `delete` 运算符释放了动态分配的内存。 注意:在创建动态数组后,一定要记得使用 `delete` 运算符释放内存,避免出现内存泄漏问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值