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 34using
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...