2023-03-13:给定一个整数数组 A,坡是元组 (i, j),其中 i < j 且 A[i] <= A[j], 这样的坡的宽度为 j - i。 找出 A 中的坡的最大宽度,如果不存在,返回 0

文章提供了解决方案,使用单调栈数据结构从右往左遍历数组,找到整数数组中的最大宽度坡。该方法的时间复杂度为O(N),空间复杂度也为O(N),其中N为数组长度。给出了Rust和Golang两种语言的实现代码。
摘要由CSDN通过智能技术生成

2023-03-13:给定一个整数数组 A,坡是元组 (i, j),其中 i < j 且 A[i] <= A[j],
这样的坡的宽度为 j - i。
找出 A 中的坡的最大宽度,如果不存在,返回 0。
示例 1:
输入:[6,0,8,2,1,5]
输出:4
解释:
最大宽度的坡为 (i, j) = (1, 5): A[1] = 0 且 A[5] = 5。
示例 2:
输入:[9,8,1,0,1,9,4,0,4,1]
输出:7
解释:
最大宽度的坡为 (i, j) = (2, 9): A[2] = 1 且 A[9] = 1。

答案2023-03-13:

单调栈,严格来说说递减栈。然后从右往左遍历。
时间复杂度:O(N)。
空间复杂度:O(N)。

这代码用山寨版chatgpt写,不用改代码。

代码用rust编写。代码如下:

fn max_width_ramp(arr: &[i32]) -> usize {
    let n = arr.len();
    // 栈中只放下标
    let mut stack = vec![0; n];
    // 栈的大小
    let mut r = 0;
    for i in 0..n {
        if r == 0 || arr[stack[r - 1]] > arr[i] {
            stack[r] = i;
            r += 1;
        }
    }
    let mut ans = 0;
    // 从右往左遍历
    // j = n - 1
    for j in (0..n).rev() {
        while r != 0 && arr[stack[r - 1]] <= arr[j] {
            let i = stack[r - 1];
            r -= 1;
            ans = ans.max(j - i);
        }
    }
    ans
}

fn main() {
    let arr = [6, 0, 8, 2, 1, 5];
    let ans = max_width_ramp(&arr);
    println!("{}", ans);

    let arr = [9, 8, 1, 0, 1, 9, 4, 0, 4, 1];
    let ans = max_width_ramp(&arr);
    println!("{}", ans);
}

在这里插入图片描述
代码用golang编写。代码如下:

package main

import "fmt"

func maxWidthRamp(arr []int) int {
	n := len(arr)
	// 栈中只放下标
	stack := make([]int, n)
	// 栈的大小
	r := 0
	for i := 0; i < n; i++ {
		if r == 0 || arr[stack[r-1]] > arr[i] {
			stack[r] = i
			r++
		}
	}
	ans := 0
	// 从右往左遍历
	// j = n - 1
	for j := n - 1; j >= 0; j-- {
		for r != 0 && arr[stack[r-1]] <= arr[j] {
			i := stack[r-1]
			r--
			ans = max(ans, j-i)
		}
	}
	return ans
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

func main() {
	if true {
		arr := []int{6, 0, 8, 2, 1, 5}
		ans := maxWidthRamp(arr)
		fmt.Println(ans)
	}
	if true {
		arr := []int{9, 8, 1, 0, 1, 9, 4, 0, 4, 1}
		ans := maxWidthRamp(arr)
		fmt.Println(ans)
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福大大架构师每日一题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值