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

2026-08-05:比较双调部分的和。用go语言,给定一个整数数组,它的排列规律是先严格递增到达唯一的最高点,然后再严格递减。我们以这个最

0
分享至

2026-08-05:比较双调部分的和。用go语言,给定一个整数数组,它的排列规律是先严格递增到达唯一的最高点,然后再严格递减。我们以这个最高点作为分界,将数组划分为两个区域:从数组开头到最高点(含最高点)为左侧区域,从最高点到数组末尾(含最高点)为右侧区域。接着,分别计算这两个区域内所有元素的总和,并比较它们的大小。如果左侧区域的总和更大,结果记为0;如果右侧区域的总和更大,结果记为1;如果两边总和相等,结果记为-1。特别需要注意的是,最高点这个元素在两侧求和时都会被重复计入一次。

3 <= n == nums.length <= 100000。

1 <= nums[i] <= 1000000000。

nums 是一个双调数组。

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

输出: 1。

解释:

峰值元素是 nums[1] = 3

递增部分 = [1, 3],和为 1 + 3 = 4

递减部分 = [3, 2, 1],和为 3 + 2 + 1 = 6

因为递减部分的和更大,返回 1。

题目来自力扣3909。

大体步骤如下:

第一步:初始化变量

  • • 设置一个整数变量diff,初始值为 0,它用于记录“递增部分(不含峰值)元素总和”与“递减部分(不含峰值)元素总和”的差值。

  • • 设置一个布尔标志inc,初始值为true,表示当前遍历位置处于数组的递增阶段。

第二步:遍历数组
从数组的第一个元素开始,逐个访问每个元素,同时获取它的索引i和值x

第三步:判断当前元素是否为峰值

  • • 如果同时满足以下三个条件,则认为当前元素是峰值:

  1. 1. 索引i大于 0(说明有前一个元素);

  2. 2. 索引i + 1小于数组长度(说明有后一个元素,但代码中未显式检查,因为双调数组保证峰值不会出现在两端);

  3. 3. 前一个元素的值小于当前值,且当前值大于后一个元素的值。

• 一旦检测到峰值,将inc设为false,表示后续元素属于递减阶段。并且,这个峰值元素本身不参与diff的累加或累减,因为峰值在左右两侧都出现,求和比较时彼此抵消,不需要单独处理。

第四步:非峰值元素的分阶段累加
如果当前元素不是峰值,则根据inc的值决定如何处理:

  • • 若inctrue(仍在递增阶段),将当前元素的值diff中。

  • • 若incfalse(已进入递减阶段),将当前元素的值diff中(相当于从左侧总和中扣减右侧元素)。

第五步:遍历完成后的结果判定
遍历结束后,diff的数值等于“递增部分(不含峰值)所有元素之和”减去“递减部分(不含峰值)所有元素之和”。
由于峰值在两侧求和中都被计入一次,两边的总和分别加上同一个峰值后,它们的差值保持不变,因此diff同时也等于“递增部分(含峰值)总和”减去“递减部分(含峰值)总和”。

  • • 如果diff > 0,说明递增部分总和更大,函数返回0

  • • 如果diff < 0,说明递减部分总和更大,函数返回1

  • • 如果diff == 0,说明两部分总和相等,函数返回-1

针对示例[1, 3, 2, 1]的运行过程

  • • 初始diff=0,inc=true

  • • i=0, x=1:非峰值,inc=true → diff += 1 → diff=1。

  • • i=1, x=3:前一个1<3且3>2,满足峰值条件 → inc=false,不操作diff。

  • • i=2, x=2:非峰值,inc=false → diff -= 2 → diff=-1。

  • • i=3, x=1:非峰值,inc=false → diff -= 1 → diff=-2。

  • • 最终 diff=-2 < 0,返回 1(递减部分更大),与预期一致。

复杂度分析
  • 时间复杂度:算法只需一次从左到右的遍历,访问每个元素常数次操作,因此总时间复杂度为O(n),其中 n 为数组长度(n ≤ 100000,满足性能要求)。

  • 额外空间复杂度:除了输入数组本身外,只使用了几个固定变量(diffinc、循环索引等),不随数组规模变化,因此额外空间复杂度为O(1)

Go完整代码如下:

package main

import (
"fmt"
)

func compareBitonicSums(nums []int) int {
diff := 0
inc := true
for i, x := range nums {
if i > 0 && nums[i-1] < x && x > nums[i+1] {
inc = false
// 注意峰顶抵消掉了,不算入 diff
} else if inc {
diff += x
} else {
diff -= x
}
}

if diff > 0 {
return 0
}
if diff < 0 {
return 1
}
return -1
}

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

Python完整代码如下:

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

from typing import List

def compare_bitonic_sums(nums: List[int]) -> int:
diff = 0
inc = True # 当前是否处于递增阶段

for i, x in enumerate(nums):
# 检测峰值:前一个元素小于当前,且当前大于后一个元素
if i > 0 and i + 1 < len(nums) and nums[i-1] < x and x > nums[i+1]:
inc = False
# 峰值不计入 diff(因为两边都包含,相互抵消)
elif inc:
diff += x
else:
diff -= x

if diff > 0:
return 0 # 递增部分(不含峰值)和大
elif diff < 0:
return 1 # 递减部分(不含峰值)和大
else:
return -1 # 两者相等

# 测试用例
if __name__ == "__main__":
nums = [1, 3, 2, 1]
print(compare_bitonic_sums(nums))

C++完整代码如下:

  


using namespace std;

int compareBitonicSums(const vector& nums) {
int diff = 0;
bool inc = true; // 当前是否处于递增阶段

for (size_t i = 0; i < nums.size(); ++i) {
int x = nums[i];
// 检测峰值:前一个元素小于当前,且当前大于后一个元素(同时确保索引不越界)
if (i > 0 && i + 1 < nums.size() && nums[i-1] < x && x > nums[i+1]) {
inc = false;
// 峰值不计入 diff,因为两边都包含,相互抵消
} else if (inc) {
diff += x;
} else {
diff -= x;
}
}

if (diff > 0) return 0; // 递增部分(不含峰值)和大
if (diff < 0) return 1; // 递减部分(不含峰值)和大
return -1; // 两者相等
}

int main() {
vector nums = {1, 3, 2, 1};
int result = compareBitonicSums(nums);
cout << result << endl;
return 0;
}
在这里插入图片描述

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

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.

相关推荐
热点推荐
汪峰自曝在醒醒10岁生日前告诉她“我与你之间,这一生开始倒数”

汪峰自曝在醒醒10岁生日前告诉她“我与你之间,这一生开始倒数”

韩小娱
2026-08-07 08:14:47
4锋线合砍8分!李梦接班人拉胯,宫鲁鸣锋无力,球迷呼吁李梦张茹归队!

4锋线合砍8分!李梦接班人拉胯,宫鲁鸣锋无力,球迷呼吁李梦张茹归队!

体坛卡卡说
2026-08-08 06:58:53
给福建纪委监委点赞,泉州一把手,张毅恭任上落马

给福建纪委监委点赞,泉州一把手,张毅恭任上落马

誮惜颜a
2026-08-08 05:58:38
1.4亿欧皇马标王!迪奥曼德,凭啥这么贵?

1.4亿欧皇马标王!迪奥曼德,凭啥这么贵?

足球报
2026-08-07 14:08:14
搜救重大转向!22岁失联女孩线索锁定夺命,全程无防护令人揪心

搜救重大转向!22岁失联女孩线索锁定夺命,全程无防护令人揪心

枯蝶
2026-08-08 00:37:36
多次公开嘲讽周星驰无儿无女,李修贤发视频道歉:自己从未压榨、转卖周星驰,并恳求网友不要网暴其家人

多次公开嘲讽周星驰无儿无女,李修贤发视频道歉:自己从未压榨、转卖周星驰,并恳求网友不要网暴其家人

韩小娱
2026-08-05 17:39:34
身家暴跌480亿,海外资产被锁,杜建英母子对宗馥莉终极围猎才刚刚开始

身家暴跌480亿,海外资产被锁,杜建英母子对宗馥莉终极围猎才刚刚开始

小蜜情感说
2026-08-07 08:25:51
马斯克摊上大事,美国火箭高速撞击月面,碎屑羽流蔓延数百英里

马斯克摊上大事,美国火箭高速撞击月面,碎屑羽流蔓延数百英里

破镜难圆
2026-08-06 21:47:00
新婚33天,陕西爱妻卷款逃往美国,丈夫花费9年把爱妻判刑65年

新婚33天,陕西爱妻卷款逃往美国,丈夫花费9年把爱妻判刑65年

云景侃记
2026-07-29 16:46:46
直播自缢的Mina确定身亡,被自己喜欢的爱豆引导网暴,就是西村力

直播自缢的Mina确定身亡,被自己喜欢的爱豆引导网暴,就是西村力

芊手若
2026-08-06 16:27:22
彻底失控!怀特塞德药检风波持续蔓延,上海男篮陷入多赛季泥潭

彻底失控!怀特塞德药检风波持续蔓延,上海男篮陷入多赛季泥潭

黄小仙的搞笑视频
2026-08-07 19:46:56
一球成名!16岁中甲新星对勒沃库森表现惊艳:目标出国留洋

一球成名!16岁中甲新星对勒沃库森表现惊艳:目标出国留洋

邱泽云
2026-08-07 17:48:41
20年婚姻居然无财产可分割,“婚外胚胎案”妻子再发声:患癌后独自面对4次大手术,下周将出庭直面男方

20年婚姻居然无财产可分割,“婚外胚胎案”妻子再发声:患癌后独自面对4次大手术,下周将出庭直面男方

极目新闻
2026-08-07 14:35:34
彻底拦不住了!乌克兰,传出惊天噩耗!

彻底拦不住了!乌克兰,传出惊天噩耗!

大嘴说天下
2026-08-06 22:10:03
朝鲜当初未曾料到,向俄罗斯派出上万名士兵参战后,平壤街头巷尾正悄然上演一场由战火与制裁共同催生的地缘大交换,正重塑整个东北亚格局

朝鲜当初未曾料到,向俄罗斯派出上万名士兵参战后,平壤街头巷尾正悄然上演一场由战火与制裁共同催生的地缘大交换,正重塑整个东北亚格局

人生录
2026-08-04 00:05:09
美国官员:阿曼与伊朗在霍尔木兹海峡的谈判取得进展 预计将很快达成协议

美国官员:阿曼与伊朗在霍尔木兹海峡的谈判取得进展 预计将很快达成协议

财联社
2026-08-08 03:18:04
变大增强:台风白海豚或再次超强台风,东部大范围暴雨将超过巴威

变大增强:台风白海豚或再次超强台风,东部大范围暴雨将超过巴威

中国气象爱好者
2026-08-08 00:26:58
唐某杰要被判重婚罪了?朱女士婚姻纠纷舆论猛烈,网友:不至于,但他的事业估计到头

唐某杰要被判重婚罪了?朱女士婚姻纠纷舆论猛烈,网友:不至于,但他的事业估计到头

火山詩话
2026-08-06 09:46:38
彻底出圈!婚外胚胎案登上东方卫视,不再是家丑,成全国警示大案

彻底出圈!婚外胚胎案登上东方卫视,不再是家丑,成全国警示大案

起喜电影
2026-08-07 05:40:49
两性关系:如果还想多活几年,70岁以后必须牢记这几句

两性关系:如果还想多活几年,70岁以后必须牢记这几句

荔子言
2026-06-05 23:10:00
2026-08-08 08:19:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1380文章数 78关注度
往期回顾 全部

科技要闻

突然涨价,"只收电费钱"的梁文锋,变了吗

头条要闻

美媒:美副防长"非常执着访华" 想在中国大学发表演讲

头条要闻

美媒:美副防长"非常执着访华" 想在中国大学发表演讲

体育要闻

去年信誓旦旦3000万 今年NBA查无此人

娱乐要闻

周也热恋结束,六个字暴露单身状态

财经要闻

腾讯WorkBuddy领跑AI办公 阿里字节急了?

汽车要闻

越7全球首秀 传祺开始进攻方盒子越野

态度原创

教育
本地
数码
健康
公开课

教育要闻

不少同学直接放弃交了,说太难了做不出来

本地新闻

课本里的童年,绍兴正上演

数码要闻

苹果旗舰台式机Mac Pro迎来20周年纪念 淘汰停产已有五个月

打干细胞会不会诱发癌症?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版