前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2024-11-28:边界元素是最大值的子数组数目。用go语言,给定一个正整数数组 nums,需要找到满足子数组中第一个和最后一

2024-11-28:边界元素是最大值的子数组数目。用go语言,给定一个正整数数组 nums,需要找到满足子数组中第一个和最后一

作者头像
福大大架构师每日一题
发布2024-11-29 16:14:57
发布2024-11-29 16:14:57
6500
代码可运行
举报
运行总次数:0
代码可运行

2024-11-28:边界元素是最大值的子数组数目。用go语言,给定一个正整数数组 nums,需要找到满足子数组中第一个和最后一个元素都是该子数组中的最大值的子数组数量。

输入:nums = [1,4,3,3,2]。

输出:6。

解释:

总共有 6 个子数组满足第一个元素和最后一个元素都是子数组中的最大值:

子数组 [1,4,3,3,2] 的1,最大元素为 1 ,第一个和最后一个元素都是 1 。

子数组 [1,4,3,3,2] 的4,最大元素为 4 ,第一个和最后一个元素都是 4 。

子数组 [1,4,3,3,2]的第1个3 ,最大元素为 3 ,第一个和最后一个元素都是 3 。

子数组 [1,4,3,3,2] 的第2个3,最大元素为 3 ,第一个和最后一个元素都是 3 。

子数组 [1,4,3,3,2]的2 ,最大元素为 2 ,第一个和最后一个元素都是 2 。

子数组 [1,4,3,3,2] 的[3,3],最大元素为 3 ,第一个和最后一个元素都是 3 。

所以我们返回 6 。

答案2024-11-28:

chatgpt[1]

题目来自leetcode3113。

大体步骤如下:

1.初始化一个计数器 ans,开始时设为数组的长度,将 ans 的数据类型设置为 int64。

2.定义一个结构体 pair,包含两个字段 x 和 cnt,用于记录数组元素和该元素出现的次数。

3.初始化一个栈 st,其中包含一个 pair 类型的元素,该元素 x 为无穷大(math.MaxInt),cnt 为 0,作为哨兵。

4.遍历数组 nums 中的每个元素 x:

  • • 如果 x 大于栈顶元素的 x,则持续弹出栈顶元素,直到栈为空或者 x 不大于栈顶元素的 x。
  • • 如果 x 等于栈顶元素的 x,将 ans 增加栈顶元素的 cnt,并且增加栈顶元素的 cnt 值。
  • • 如果 x 小于栈顶元素的 x,将一个新的 pair{x, 1} 压入栈中。

5.返回 ans。

总的时间复杂度:O(n),其中 n 为数组 nums 的长度,因为对数组进行了一次线性遍历。

总的额外空间复杂度:O(n),存储栈所需的空间为 O(n)。

Go完整代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
use std::cmp;

fn number_of_subarrays(nums:Vec<i32>)-> i64 {
let mut ans = nums.len()as i64;
let mut st:Vec<(i32, i32)>= vec![(i32::MAX,0)];// 使用 (值, 计数) 作为元组

for&x in&nums {
while x > st.last().unwrap().0{
            st.pop();
}
if x == st.last().unwrap().0{
            ans += st.last().unwrap().1as i64;// 累加计数
letlast= st.last_mut().unwrap();
last.1+=1;// 计数加一
}else{
            st.push((x,1));// 添加新值及其计数
}
}

    ans
}

fn main(){
let nums = vec![1,4,3,3,2];
println!("{}", number_of_subarrays(nums));
}

Rust完整代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
use std::cmp;

fnnumber_of_subarrays(nums:Vec<i32>)->i64{
letmut ans= nums.len()asi64;
letmut st:Vec<(i32,i32)>=vec![(i32::MAX,0)];// 使用 (值, 计数) 作为元组

for&x in&nums {
while x > st.last().unwrap().0{
            st.pop();
}
if x == st.last().unwrap().0{
            ans += st.last().unwrap().1asi64;// 累加计数
letlast= st.last_mut().unwrap();
            last.1+=1;// 计数加一
}else{
            st.push((x,1));// 添加新值及其计数
}
}

    ans
}

fnmain(){
letnums=vec![1,4,3,3,2];
println!("{}",number_of_subarrays(nums));
}
引用链接

[1] chatgpt: https://chatbotsplace.com/?rc=nnNWSCJ7EP

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大体步骤如下:
  • Go完整代码如下:
  • Rust完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档