怎样做类似淘宝网的网站,东营 网站建设公司,互联网平台建设方案,wordpress插件放哪儿的著名的快速排序算法里有一个经典的划分过程#xff1a;我们通常采用某种方法取一个元素作为主元#xff0c;通过交换#xff0c;把比主元小的元素放到它的左边#xff0c;比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列#xff0c;请问有多少个元…著名的快速排序算法里有一个经典的划分过程我们通常采用某种方法取一个元素作为主元通过交换把比主元小的元素放到它的左边比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列请问有多少个元素可能是划分前选取的主元
例如给定 N5, 排列是1、3、2、4、5。则
1 的左边没有元素右边的元素都比它大所以它可能是主元 尽管 3 的左边元素都比它小但其右边的 2 比它小所以它不能是主元 尽管 2 的右边元素都比它大但其左边的 3 比它大所以它不能是主元 类似原因4 和 5 都可能是主元。 因此有 3 个元素可能是主元。
输入格式 输入在第 1 行中给出一个正整数 N≤10 5 第 2 行是空格分隔的 N 个不同的正整数每个数不超过 10 9 。
输出格式 在第 1 行中输出有可能是主元的元素个数在第 2 行中按递增顺序输出这些元素其间以 1 个空格分隔行首尾不得有多余空格。
输入样例 5 1 3 2 4 5 输出样例 3 1 4 5
解题思路:这题我认为时间给的比较仓促还是要找最优解算法题目很清晰就是快排的一次划分那我们就按照定义来看主元必须是左边小于它右边大于它的那我们一次循环找到左边最大的和它比再另一次循环找到右边最小的和它比满足左边最大的小于等于它同时右边最小的也大于等于它它不就是主元嘛。。这样我们俩次循环就可以搞定不停维护最大值和最小值即可如果别的办法恐怕 就得o(n^2)恐怕会超时。
c语言代码如下
#includestdio.h
#includestring.h
int main()
{int n,i;scanf(%d,n);int a[n];int b[n];int c[n];memset(b,0,sizeof(b));memset(c,0,sizeof(c));for(i0;in;i)scanf(%d,ai);int maxa[0],mina[n-1];for(i0;in;i){if(a[i]max){b[i]1;maxa[i];}}for(in-1;i0;i--){if(a[i]min){c[i]1;mina[i];}}int output[n],count0;for(i0;in;i){if(b[i]1c[i]1){output[count]a[i];}}printf(%d\n,count);for(i0;icount;i){if(i!count-1)printf(%d ,output[i]);elseprintf(%d,output[i]);}printf(\n);return 0;
}python版本:尽量不要是使用函数哪怕麻烦一点太容易超时了
nint(input())
sinput().split()
for i in range(n):s[i]int(s[i])
b[0]*n
c[0]*n
max_ps[0]
min_ls[n-1]
for i in range(n):if s[i]max_p:b[i]1max_ps[i]
in-1
while(i0):if s[i]min_l:c[i]1min_ls[i]ii-1
output[]
count0
for i in range(n):if b[i]1 and c[i]1:output.append((s[i]))count1
print(count)
for i in range(count):if i count-1:print(output[i],end)else:print(output[i],end )
print()