银河国际游戏平台官网 2026-03-27: 替换至多一个元素后最长非递减子数组。用go谈话, 给

发布日期:2026-03-27 18:04    点击次数:155

银河国际游戏平台官网 2026-03-27: 替换至多一个元素后最长非递减子数组。用go谈话, 给

你最多只可遴选其中一个位置的元素,把它改成狂放整数(也不错遴选不改)。

在允许这种“最多一次蜕变”的情况下,求能得到的最长说合非递减子数组的长度。

所谓“非递减子数组”,指的是该说合片断中狂放相邻两项齐喜跃:后一个元素 不小于 前一个元素。

子数组示意数组中一段说合的元素序列。

1

-1000000000

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

输出: 4。

讲明:

将 nums[3] = 1 替换为 3 得到数组 [1, 2, 3, 3, 2]。

最长非递减子数组是 [1, 2, 3, 3],其长度为 4。

题目来独力扣3738。

一、题目中枢泄漏

咱们的目标是:最多修改数组中1个元素(也不错不修改),找到数组中最长的说合非递减子数组(说合片断,相邻元素后≥前)。

示例:[1,2,3,1,2],修改第4个元素1为3,得到[1,2,3,3,2],最宗子数组长度为4。

二、中枢想路:动态盘算(景况纪录)

这谈题用动态盘算处分,中枢是遍历数组时,纪录两个要道景况,相通常存储全量数据,仅用变量更新:

1. 景况1(f0):以现时元素遣散,不修改任何元素的最长非递减子数组长度;

2. 景况2(f1):以现时元素遣散,仍是修悛改1个元素的最长非递减子数组长度;

3. 异常用变量纪录历史景况,补助诡计修改操作后的长度。

遍历数组时,每一步齐凭据前一个元素和现时元素的大小关系,更新这两个景况,并同步纪录全局最大值。

三、分要领详备引申经由(以 nums = [1,2,3,1,2] 为例)

数组索引:0:1, 1:2, 2:3, 3:1, 4:2

运转景况:

• pre0:保存上上个位置的f0值(运转0)

• f0:现时不修改的最长长度(运转1,第一个元素自己)

• f1:现时修改1次的最长长度(运转1)

• ans:最终谜底(运转1)

要领1:遍历索引 i=1(元素=2)

前一个元素是索引0(1),喜跃 1 ≤ 2(非递减):

1. 不修改的长度f0:在前一个f0基础上+1 → 变为2;

2. 修改1次的长度f1:在前一个f1基础上+1 → 变为2;

3. 搜检是否能通过修改元素延宗子数组:喜跃要求,更新f1;

4. 全局最大值ans更新为2。

要领2:遍历索引 i=2(元素=3)

前一个元素是索引1(2),喜跃 2 ≤ 3:

1. 不修改的长度f0:+1 → 变为3;

2. 修改1次的长度f1:+1 → 变为3;

3. 搜检修改逻辑,更新f1;

4. 全局最大值ans更新为3。

要领3:遍历索引 i=3(元素=1)【要道修改点】

前一个元素是索引2(3),银河国际不喜跃 3 ≤ 1(递减):

1. 不修改的长度f0:无法不竭,重置为1(仅自己);

2. 中枢:这里不错引申一次修改操作,把现时元素1改成≥3的数(比如3);

3. 修改1次的长度f1:连合前两段灵验长度,诡计得到4;

4. 全局最大值ans更新为4(这即是示例的谜底)。

要领4:遍历索引 i=4(元素=2)

前一个元素是索引3(1),喜跃 1 ≤ 2:

1. 不修改的长度f0:+1 → 变为2;

2. 修改1次的长度f1:不竭之前的景况+1;

3. 全局最大值ans保抓4不变。

最终规章

遍历完结,全局最大值为4,与题目输出一致。

四、中枢逻辑回来

1. 说合非递减时:不修改和修悛改的长度齐平直+1,不竭子数组;

2. 出现递减时:

• 不修改的长度平直重置为1(无法说合);

• 诈欺独逐一次修改契机,把现时递减的元素改成合正值,拼接前后两段灵验子数组,诡计修改后的最长长度;

3. 全程只更新几个变量,不存储过剩数据,及时更新最长长度。

五、复杂度分析

1. 时期复杂度

• 咱们只遍历了数组一次,每个元素仅作念常数次诡计(判断、加减、取最大值);

• 时期复杂度:O(n)(n为数组长度)。

• 适配题目要求:n最大10万,O(n)是最优规章,无超时风险。

2. 异常空间复杂度

• 全程仅使用了固定数目的变量(pre0、f0、f1、ans、临时变量);

• 莫得创建数组、哈希表等与n联系的异常数据结构;

• 异常空间复杂度:O(1)(常数级空间)。

回来

1. 解题中枢:动态盘算+双景况(不修改/修改1次),遍历一次数组完成诡计;

2. 引申经由:遭逢非递减平直蔓延,遭逢递减用独一修改契机拼接子数组;

3. 规章:时期O(n),空间O(1),竣工适配大数据量的题目要求。

Go完整代码如下:

package main

import (

"fmt"

)

func longestSubarray(nums []int)int {

pre0, f0, f1 := 0, 1, 1

ans := 1// 以 nums[0] 遣散的子数组长度

for i := 1; i

tmp := f0

if nums[i-1]

f0++

f1++

} else {

f0 = 1

f1 = 0// 破除旧数据

}

if i >= 2 && nums[i-2]

f1 = max(f1, pre0+2)

} else {

f1 = max(f1, 2)

}

ans = max(ans, tmp+1, f1)

pre0 = tmp

}

return ans

}

func main {

nums := []int{1, 2, 3, 1, 2}

result := longestSubarray(nums)

fmt.Println(result)

}

Python完整代码如下:

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

def longestSubarray(nums):

if not nums:

return0

pre0, f0, f1 = 0, 1, 1

ans = 1 # 以 nums[0] 遣散的子数组长度

for i in range(1, len(nums)):

tmp = f0

if nums[i-1]

f0 += 1

f1 += 1

else:

f0 = 1

f1 = 0 # 破除旧数据

if i >= 2 and nums[i-2]

f1 = max(f1, pre0 + 2)

else:

f1 = max(f1, 2)

ans = max(ans, tmp + 1, f1)

pre0 = tmp

return ans

def main:

nums = [1, 2, 3, 1, 2]

result = longestSubarray(nums)

print(result)

if __name__ == "__main__":

main

C++完整代码如下:

#include

#include

#include

using namespace std;

int longestSubarray(vector& nums) {

if (nums.empty) return0;

int pre0 = 0, f0 = 1, f1 = 1;

int ans = 1; // 以 nums[0] 遣散的子数组长度

for (int i = 1; i

int tmp = f0;

if (nums[i-1]

f0++;

f1++;

} else {

f0 = 1;

f1 = 0; // 破除旧数据

}

if (i >= 2 && nums[i-2]

f1 = max(f1, pre0 + 2);

} else {

f1 = max(f1, 2);

}

ans = max({ans, tmp + 1, f1});

pre0 = tmp;

}

return ans;

}

int main {

vector nums = {1, 2, 3, 1, 2};

int result = longestSubarray(nums);

cout

return0;

}

咱们信服东谈主工智能为平淡东谈主提供了一种“增强器具”,并尽力于共享全标的的AI学问。在这里,您不错找到最新的AI科普著述、器具评测、教学规章的心事以及行业知悉。

宽待温雅“福大大架构师逐日一题”银河国际游戏平台官网,发音尘可取得口试辛勤,让AI助力您的异日发展。

开云体育官方网站 - KAIYUN


Copyright © 1998-2026 银河国际游戏平台官网™版权所有

cychache.com 备案号 备案号: -

技术支持:®银河国际  RSS地图 HTML地图