现在的位置: 首页 > 综合 > 正文

n方找n个数的区间中位数

2018年05月02日 ⁄ 综合 ⁄ 共 501字 ⁄ 字号 评论关闭

新发现,好好品味;

先枚举中间项 i ,对于每个 i,求出 i 到左边的数 j 时比它大的数与比它小的数的差,同时求出在 i 的右边,到 k 比它小的数与比它大的数的差,当两个差的差<=1时满足
i 是中位数。 

for i:=1 to n do

begin
fillchar(g,sizeof(g),0);
fillchar(pre,sizeof(pre),0);
big:=0; small:=0;
for j:=i downto 1 do
begin
if a[j]>a[i] then inc(big) else inc(small);
k:=big-small;
pre[j]:=g[k];
g[k]:=j;
end;
big:=0; small:=-1;
for j:=i to n do
begin
if a[j]>a[i] then inc(big) else inc(small);
k:=small-big;
l:=g[k];
while l>0 do
begin
if (j-l)mod 2=1 then mid[l,j]:=i;
l:=pre[l];
end;
l:=g[k-1];
while l>0 do
begin
if (j-l)mod 2=0 then mid[l,j]:=i;
l:=pre[l];
end;
end;
end;

【上篇】
【下篇】

抱歉!评论已关闭.