这道题一开始看错了题目,以为是主元(左边都小于主元,右边都大于主元)或者(左边都大于主元,左边都小于主元)两种情况,没想到其实只需要解第一种情况就够了,这样其实简单很多。但是这道题用python写很慢,不能暴力解,需要将算法优化.
int比eval好!!
这是第一遍写的代码
num=eval(input())
text=input().split()
lis=[text[0],text[-1]]
for x in range(1,num-1):
xiao=da=False
key=True
for y in text[0:x]:
if y<text[x]:
xiao=True
else:
da=True
if xiao and da:
break
else:
if xiao:
copy=text[x+1:]
min_num=min(map(eval,copy))
if min_num<eval(text[x]):
key=False
if da:
copy=text[x+1:]
max_num=max(map(eval,copy))
if max_num>eval(text[x]):
key=False
if key:
lis.append(text[x])
lis=sorted(lis,key=lambda x:int(x),reverse=False)
print(len(lis))
print(' '.join(lis))
****
#这是第二遍
#但这样显然不行,经过算法优化后,最后得到
num=eval(input())
text=input().split()
text=list(map(eval,text))
lis=[]
for x in range(0,num):
key=True
for y in text[:x]:
if y>text[x]:
key=False
if not key:
break
else:
for p in text[x+1:]:
if p<text[x]:
key=False
if key:
lis.append(str(text[x]))
lis=sorted(lis,key=lambda x:int(x),reverse=False)
print(len(lis))
print(' '.join(lis))
```python
num=eval(input())
text=input().split()
text=list(map(int,text))
text_copy=sorted(text,reverse=False)
lis=[]
max=0
for p in range(0,num):
if text[p]>max:
max=text[p]
if text[p]==text_copy[p]:
lis.append(str(text[p]))
lis=sorted(lis,key=lambda x:int(x),reverse=False)
print(len(lis))
print(' '.join(lis))
代码分析,第二行代码存在大量无效重复的比较,有点类似于冒泡排序中的无效比较,于是用max变量,并迭代故可大大减少无效比较。另外一个优化点是发现,位置相同,这没有什么好说的