网易首页 > 网易号 > 正文 申请入驻

2026-08-08:数组中的有效元素。用go语言,给定一个整数序列。对于其中的任意一个数,如果它比它左边出现过的所有数都大,或者比它右边出

0
分享至

2026-08-08:数组中的有效元素。用go语言,给定一个整数序列。对于其中的任意一个数,如果它比它左边出现过的所有数都大,或者比它右边出现过的所有数都大,那它就符合筛选条件。另外,序列的第一个数和最后一个数无论大小都直接视为符合条件。最后,按照这些数在原序列中的出现顺序,将它们全部找出来。

1 <= nums.length <= 100。

1 <= nums[i] <= 100。

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

输出: [1,2,4,3,2]。

解释:

nums[0] 和 nums[5] 始终有效。

nums[1] 和 nums[2] 都严格大于其左侧的所有元素。

nums[4] 严格大于其右侧的所有元素。

因此,答案为 [1, 2, 4, 3, 2]。

题目来自力扣3912。

该算法分两个主要阶段,通过两次遍历和辅助标记数组,找出所有符合“左侧最大”或“右侧最大”条件的有效元素。

阶段一:从右向左遍历,标记右侧最大元素

  1. 1. 创建一个与输入数组nums等长的布尔数组rightValid,用于记录每个位置的元素是否严格大于它右边的所有元素。初始时所有值均为假。

  2. 2. 设置一个变量mx,表示当前已经扫描过的右侧部分的最大值。由于数组元素取值范围为 1~100,将mx初始化为 0(任何元素都大于 0),这样可以正确处理数组最后一个元素。

  3. 3. 从最后一个元素开始,逆序向前遍历数组:

  • • 取出当前元素x。

  • • 若x严格大于mx,则说明x大于它右侧所有已扫描元素,即满足“严格大于右侧所有元素”的条件,将rightValid[i]设为真;否则设为假。

  • • 然后用x更新mx,使mx始终维护从当前位置到数组末尾的最大值。

4. 遍历结束后,rightValid数组的每个位置都对应原数组元素,标记了该元素是否比它右边的所有数都大。特别地,最后一个元素右侧无元素,其对应mx初始为 0,因此一定会被标记为真,符合题目“最后一个元素始终有效”的规则。

阶段二:从左向右遍历,结合左侧条件和右侧标记收集结果

  1. 1. 重置mx为 0,此时mx表示当前已扫描过的左侧部分的最大值。

  2. 2. 准备一个空的结果列表ans,用于按序存放有效元素。

  3. 3. 从第一个元素开始,顺序向前遍历数组:

  • • 取出当前元素x。

  • • 判断条件:若x严格大于mx,则说明x大于它左侧所有已扫描元素,即满足“严格大于左侧所有元素”;若rightValid[i]为真,则说明x满足“严格大于右侧所有元素”。这两个条件只要满足其一,当前元素就是有效元素,将其加入ans。

  • • 无论是否加入结果,都用x更新mx,使mx始终维护从数组起始到当前位置的最大值。

4. 对于第一个元素,因其左侧无元素,mx初始为 0,必然满足x > mx,因此一定会被加入结果,符合“第一个元素始终有效”的规则。

5. 遍历完成后,ans中即为所有有效元素,且保持了原数组的出现顺序。

时间复杂度分析

算法包含两次独立的线性遍历:从右向左遍历一次,从左向右遍历一次,每次仅包含常数时间的比较、赋值和更新操作。因此总的时间复杂度为O(n),其中 n 为数组长度。

额外空间复杂度分析

除了输入数组和最终返回的结果数组外,算法额外分配了一个长度与输入相同的布尔数组rightValid,用于存储每个位置的右侧最大标记。该数组占用 O(n) 空间。过程中仅使用了常数个辅助变量(如mx、循环索引等),因此总的额外空间复杂度为O(n)。如果严格将返回结果所用的空间不计入额外空间,则依然为 O(n)。

Go完整代码如下:

package main

import (
"fmt"
"slices"
)

func findValidElements(nums []int) (ans []int) {
// 标记严格大于其右侧所有元素的元素
rightValid := make([]bool, len(nums))
mx := 0
for i, x := range slices.Backward(nums) {
rightValid[i] = x > mx
mx = max(mx, x)
}

mx = 0
for i, x := range nums {
if x > mx || rightValid[i] {
ans = append(ans, x)
}
mx = max(mx, x)
}
return
}

func main() {
nums := []int{1, 2, 4, 2, 3, 2}
result := findValidElements(nums)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

def findValidElements(nums):
n = len(nums)
rightValid = [False] * n
mx = 0
for i in range(n - 1, -1, -1):
x = nums[i]
rightValid[i] = x > mx
mx = max(mx, x)

mx = 0
ans = []
for i, x in enumerate(nums):
if x > mx or rightValid[i]:
ans.append(x)
mx = max(mx, x)
return ans

if __name__ == "__main__":
nums = [1, 2, 4, 2, 3, 2]
result = findValidElements(nums)
print(result)

C++完整代码如下:

  




std::vector findValidElements(const std::vector& nums) {
int n = nums.size();
if (n == 0) return {};

// 标记严格大于其右侧所有元素的元素
std::vector rightValid(n, false);
int mx = 0;
for (int i = n - 1; i >= 0; --i) {
int x = nums[i];
rightValid[i] = (x > mx);
mx = std::max(mx, x);
}

// 根据左侧最大值和右侧标记收集有效元素
std::vector ans;
mx = 0;
for (int i = 0; i < n; ++i) {
int x = nums[i];
if (x > mx || rightValid[i]) {
ans.push_back(x);
}
mx = std::max(mx, x);
}
return ans;
}

int main() {
std::vector nums = {1, 2, 4, 2, 3, 2};
std::vector result = findValidElements(nums);
for (int x : result) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
3大新援已有两个水货!曼联高层承认夏窗引援水准欠佳

3大新援已有两个水货!曼联高层承认夏窗引援水准欠佳

球事百科吖
2026-10-13 04:22:45
“陈皮骗局”爆火:刺痛了多少中国人...

“陈皮骗局”爆火:刺痛了多少中国人...

温伯陵的烟火人间
2026-10-12 21:38:16
欧美港口:拆掉中国设备!工人拆完,领导:我让你拆的是,Logo

欧美港口:拆掉中国设备!工人拆完,领导:我让你拆的是,Logo

星落山间
2026-09-07 00:46:19
6-4到4-2!海港火力全开,蒋光太缺阵后防吃紧,大田反击暗藏杀机

6-4到4-2!海港火力全开,蒋光太缺阵后防吃紧,大田反击暗藏杀机

汪星人哟
2026-10-13 08:07:48
开播一天拿下热度冠军!观众盛赞:首集就欲罢不能

开播一天拿下热度冠军!观众盛赞:首集就欲罢不能

小椰的奶奶
2026-10-13 02:16:05
单年暴跌60万辆后绝地反击,广州这次押上全部家底

单年暴跌60万辆后绝地反击,广州这次押上全部家底

音乐时光的娱乐
2026-10-12 16:21:11
出战4分钟0分5犯2失误!辽篮潜力中锋被打回原形:这状态咋接班韩德君

出战4分钟0分5犯2失误!辽篮潜力中锋被打回原形:这状态咋接班韩德君

篮球快餐车
2026-10-13 05:49:10
2026年值得考虑的7款富士相机

2026年值得考虑的7款富士相机

固件更新中
2026-10-12 06:56:09
许志安演唱会落幕,郑秀文后台深情相拥:人生没有放弃自己的理由

许志安演唱会落幕,郑秀文后台深情相拥:人生没有放弃自己的理由

吃青菜长高
2026-10-12 13:04:35
我才65岁,儿子就要送我去养老院,我无奈同意,临行前去银行注销了银行卡,入住7天后,儿子跑来找我:妈,我这个月的房贷怎么逾期了?

我才65岁,儿子就要送我去养老院,我无奈同意,临行前去银行注销了银行卡,入住7天后,儿子跑来找我:妈,我这个月的房贷怎么逾期了?

蝉吟槐蕊
2026-10-12 23:23:58
吃饭决定寿命?医生发现:活过85岁的老人,吃饭一般都有4特点

吃饭决定寿命?医生发现:活过85岁的老人,吃饭一般都有4特点

医学原创故事会
2026-10-11 23:26:04
广东3消息!杜锋重返宏远,胡明轩官宣担任队长,三外援首秀时间确定

广东3消息!杜锋重返宏远,胡明轩官宣担任队长,三外援首秀时间确定

多特体育说
2026-10-12 20:37:40
拜仁豪掷天价挖角!巴萨核心坐冷板凳!弗里克或逼走诺坎普大将

拜仁豪掷天价挖角!巴萨核心坐冷板凳!弗里克或逼走诺坎普大将

奶盖熊本熊
2026-10-13 07:43:00
花800块跑了900亿Token:Kimi做设计、GLM干活、DeepSeek审计、豆包管图片,这套国产AI组合到底值不值

花800块跑了900亿Token:Kimi做设计、GLM干活、DeepSeek审计、豆包管图片,这套国产AI组合到底值不值

阿鑫讲ai
2026-10-12 23:46:16
蔡国庆每月给弟弟蔡军发2万工资,发了20年,一共480万,条件就一个:在家全职照顾得阿尔茨海默症的母亲

蔡国庆每月给弟弟蔡军发2万工资,发了20年,一共480万,条件就一个:在家全职照顾得阿尔茨海默症的母亲

LULU生活家
2026-09-02 19:51:47
智能电插座遭黑客攻击致多地鱼友“全缸覆灭”?厂商:部分产品被攻击,已报警

智能电插座遭黑客攻击致多地鱼友“全缸覆灭”?厂商:部分产品被攻击,已报警

封面新闻
2026-10-12 10:05:14
曾经“红极一时”,如今“跌下神坛”的3家服装品牌,你买过吗?

曾经“红极一时”,如今“跌下神坛”的3家服装品牌,你买过吗?

李健政观察
2026-09-04 00:22:56
灵活就业想靠单位缴社保,就算不要工资,也不是这么简单

灵活就业想靠单位缴社保,就算不要工资,也不是这么简单

娱乐圈见解说
2026-10-13 03:13:35
放进冰箱变“毒药”,这6种食物千万不要放冰箱冷藏,尤其是第6种

放进冰箱变“毒药”,这6种食物千万不要放冰箱冷藏,尤其是第6种

神牛
2026-10-11 16:13:59
海蒂·克鲁姆泳池边半裸晒照!只穿丁字裤,配文洛杉矶很热

海蒂·克鲁姆泳池边半裸晒照!只穿丁字裤,配文洛杉矶很热

草莓解说体育
2026-10-12 03:50:51
2026-10-13 09:35:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1511文章数 83关注度
往期回顾 全部

科技要闻

尊界:10月底确认制动踏板支架升级方案

头条要闻

牛弹琴:美国突然转向俄罗斯一边 欧洲看得目瞪口呆

头条要闻

牛弹琴:美国突然转向俄罗斯一边 欧洲看得目瞪口呆

体育要闻

一周吃6顿披萨的胖子,也能单防姆巴佩?

娱乐要闻

张艺谋身体状况曝光 陈婷不再顾及体面

财经要闻

险资“追涨杀跌”致科技股持续回调?

汽车要闻

小鹏G9L巴黎车展全球上市 法国市场售价74990欧元起

态度原创

健康
艺术
教育
亲子
军事航空

孩子运动莫名晕倒?当心这类疾病

艺术要闻

台北故宫一件魏晋真迹,被称作晋代笔法的“活化石”,水平不输《兰亭序》!

教育要闻

4个正在崛起的专业,市场需求旺盛;另有4个难度拉满,挂科率高的专业,都是什么情况?

亲子要闻

著名专家:试管婴儿寿命仅40年,那首例试管婴儿如今如何了?

军事要闻

视频:沙特方面公布利雅得机场遭袭画面

无障碍浏览 进入关怀版