微軟 筆試 找出最大序列對

2021-09-06 06:45:14 字數 1660 閱讀 6426

對於乙個陣列,找出這樣乙個序列對(i, j),滿足a[i] < a[j],且使 j - i的值最大,輸出j - i的值。

這道題最初想到的是o(n^2)的解答,後來想到了用mergesort時來記錄最大序列對的方法,也可以用乙個佇列來做。總之解法還挺多。

最後和何海濤的這題非常相似。

方法1:mergesort,陣列的元素需要記錄原始的元素索引。

1 #include 2

using

namespace

std;34

struct

node5;

9 node b[1000

];10

11int mergesort(node a, int left, int

right)

1245

46while(i <=mid)

4757

58while(j <=right)

5969

70return

res;71}

7273

intmain()74;

7677

int asize = sizeof(a) / sizeof(int

);78

79 node *c = new

node[asize];

8081

for(int i = 0; i < asize; i++)

8286

87 cout << mergesort(c, 0, asize - 1) <88 }

方法2:用乙個佇列儲存遞減序列,從陣列的第乙個數開始,不斷放入,當當前數小於佇列的尾元素則放入。這樣就構成了乙個遞減序列。當有新元素時查詢佇列中第乙個小於新元素的數,然後就能得出乙個j-i的值,如此就能得出解。由於佇列有序,所以用二分查詢的變形o(logn)。最後總的複雜度o(nlogn)

1 #include 2 #include 3

using

namespace

std;45

struct

node

610 node(int idx, int

v):index(idx), val(v){}

11};

1213

int findindex(vector&a, int left, int right, int

key)

1425

else

2629}30

31int solve(int a, int

asize)

3251

52return

res;53}

5455

intmain()56;

58int asize = sizeof(a) / sizeof(int

);59 cout << solve(a, asize) <6061

int b = ;

62int bsize = sizeof(b) / sizeof(int

);63 cout << solve(b, bsize) <6465

int c = ;

66int csize = sizeof(c) / sizeof(int

);67 cout << solve(c, csize) <68 }

最大序列和

輸入描述 第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸出描述 輸入可能包括多組資料,對於每一組輸入資料,僅輸出乙個數,表示最大序列和。輸入例子 5 1 5 3 2 4 61 2 3 4 10 6 4 3 1 2 5輸出例子 9 7 1 include using namespace s...

最大序列和

給出乙個整數序列s,其中有n個數,定義其中乙個非空連續子串行t中所有數的和為t的 序列和 對於s的所有非空連續子串行t,求最大的序列和。變數條件 n為正整數,n 1000000,結果序列和在範圍 2 63,2 63 1 以內。第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸入可能包括多組資...

最大序列和

給出乙個整數序列s,其中有n個數,定義其中乙個非空連續子串行t中所有數的和為t的 序列和 對於s的所有非空連續子串行t,求最大的序列和。變數條件 n為正整數,n 1000000,結果序列和在範圍 2 63,2 63 1 以內。第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸入可能包括多組資...