最长子数组

给定一个数组,修改其中一个数字,找到最长子数组

题目

给定一个无序的整型数组,允许将其中一个元素修改为任意整型值(包括原值),使修改后的数组存在尽可能长的连续递增序列。
输出修改后数组最长递增序列的长度

输入描述
第一行输入为数组长度;第二行输入为数组元素,以空格隔开。数组中无重复元素,输入元素的取值范围为[-100000,100000]。
输出描述
修改之后数组内最长连续递增序列的长度
示例1
输入
5
3 1 2 5 4
输出
4
说明:将5改为3,或将3改为0
示例2
输入
4
3 7 4 8
输出
3
说明:将7改为小于4的值

解析

先找到所有递增子数组,
将所有的子数组与相邻子数组进行修改一位合并,如果不能合并则+1,可以合并则+另一个数组长度。
找到合并后的最长子数组。

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#判断两个子数组能否合并
def check(nums,seq1,seq2):
if (seq1[1]-seq1[0]+1)==1:
return seq2[1]-seq2[0]+1+1
if (seq2[1]-seq2[0]+1)==1:
return seq1[1]-seq1[0]+1+1
if (nums[seq2[0]+1]>nums[seq1[1]]+2) or (nums[seq2[0]]>nums[seq1[1]-1]+2):
return seq2[1]-seq2[0]+1+seq1[1]-seq1[0]+1
len1=seq1[1]-seq1[0]+1
len2=seq2[1]-seq2[0]+1
if len1>len2:
return len1+1
else:
return len2+1
if __name__ == '__main__':
count=int(input())
nums=[int(a) for a in input().split(' ')]
seqs=[]
index=0
#先将原数组划分为递增的多个子数组
for i in range(len(nums)):
i=i+1
if i==len(nums):
seqs.append([index,i-1])
break
if nums[i-1]>=nums[i]:
seqs.append([index,i-1])
index=i
#将相邻的子数组合并,找到最长的子数组
max=seqs[0][1]+seqs[0][0]+1
for i in range(len(seqs)):
if i==len(seqs)-1:
break
else:
result=check(nums,seqs[i],seqs[i+1])
if result>max:
max=result
print(max)
Contents
  1. 1. 题目
  2. 2. 解析
  3. 3. 源码
|