求兩個有序陣列歸併之後的第k個最小值

2021-09-27 12:53:10 字數 1277 閱讀 3251

1. 題目:給定兩個有序陣列(公升序)。求兩個陣列合併之後的第k小值。

2. 分析:常規演算法將陣列合併,之後從前向後遍歷一次,找到k位的值,時間複雜度o(m+n)。改進之後的演算法:不需要歸併兩個陣列,而是使用兩個指標分別從兩個有序陣列的起始向後走,如果a[i]<=b[j],那麼i++,直到a[i]>b[j] ; 如果a[i]>=b[j],那麼j++,直到a[i]3. **:

1 #include 2 #include 3

4using

namespace

std;56

//改進的二分搜尋演算法7//

時間複雜度為o(lgm+lgn)

8int findkthsmallest(int a, int m, int b, int n, int

k) 40

4142

int findkthsmallest1(int a, int m, int b, int n, int

k) 55

return

b[j];56}

57else

if (j>=n)

5863

return

a[i];64}

65else

6673

//找到第k個數,那麼a[i]和b[j]中的較小的

74//

那個就是第k個數

75if ((i1==k))

7681

else

82return

b[j];83}

84}85else

8691

if ((j1==k))

9297

else

98return

a[i];99}

100}

101}

102}

103}

104105

106void testfindkthsmallest(int a, int m, int b, int

n)107

112for (int i=1;i<=m+n;i++)

113116

}117

118119

intmain()

120;

122int a[m]=;

123int b[n]=;

124testfindkthsmallest(a,m,b,n);

125return0;

126 }

4. 原題中給定的陣列a和b不含有重複的元素,這裡對原題的**稍作修改,可以滿足有重複元素出現的情況。

求兩個有序陣列歸併之後的第k個最小值

1.題目 給定兩個有序陣列 公升序 求兩個陣列合併之後的第k小值。2.分析 常規演算法將陣列合併,之後從前向後遍歷一次,找到k位的值,時間複雜度o m n 改進之後的演算法 不需要歸併兩個陣列,而是使用兩個指標分別從兩個有序陣列的起始向後走,如果a i b j 那麼i 直到a i b j 如果a i...

歸併兩個有序陣列

題目 有兩個有序的陣列a1和a2,內存在a1的末尾有足夠多的空餘空間容納a2。請實現乙個函式,把a2中的所有數字插入到a1中並且所有的數字是排序的。解法 從後向前依次比較處理,減少移動次數,提高效率。void sorta1a2 int a1,int length1,int sizeofa1,int ...

兩個有序陣列的第k大數

coding utf 8 兩有序陣列的第k大 一種思路是用o m n 的空間複雜度,然後時間複雜度的話只需要o k 吧,就是從後往前掃k個就ok了 另一就是不需要額外的空復,然後時復o log m n 遞迴 a 19,11,8,7,4,2,0 b 13,8,6,3,1 k 4 m,n len a l...