谷歌面試題 兩個陣列合併後第k小的數字

2021-06-23 03:54:56 字數 1458 閱讀 1540

題目描述:給定兩個整型陣列a和b。我們將a和b中的元素兩兩相加可以得到陣列c。

譬如a為[1,2],b為[3,4].那麼由a和b中的元素兩兩相加得到的陣列c為[4,5,5,6]。

現在給你陣列a和b,求由a和b兩兩相加得到的陣列c中,第k小的數字。

輸入:輸入可能包含多個測試案例。

對於每個測試案例,輸入的第一行為三個整數m,n, k(1<=m,n<=100000, 1<= k <= n *m):n,m代表將要輸入陣列a和b的長度。

緊接著兩行, 分別有m和n個數, 代表陣列a和b中的元素。陣列元素範圍為[0,1e9]。

輸出:對應每個測試案例,

輸出由a和b中元素兩兩相加得到的陣列c中第k小的數字。

樣例輸入:

2 2 3

1 23 4

3 3 4

1 2 7

3 4 5

樣例輸出:

5

6

分析:
1.對兩陣列分別進行排序。
2.使用剪下法,如果a[i]+b[j]>val,則a[i]+b[j+1],a[i]+b[j+2]...a[i]+b[n]均大於val;反之,則說明陣列a選取第i個元素作為左加數後,陣列b中有j個元素可以作為右加數,能夠使a[i]+b[0...j]<=val。
3.對i進行遍歷,則可以確定值val在合併後的陣列c中排名(很關鍵)。
4.採用二分法,求出中值mid在合併後的陣列中排名,如果mid的排名》k,說明排第k位的數在mid左側;否則,去右側查詢。
#include#include#includeusing namespace std;

long long a[109999];

long long b[109999];

long long n,m;

long long cmp(long long a,long long b)

return add;

}long long find(long long ll,long long rr,long long k)

return ll;

}int main()

sort(&a[1],&a[n+1],cmp);

for(i=1;i<=m;i++)sort(&b[1],&b[1+m],cmp);

ll=a[1]+b[1];

rr=a[n]+b[m];

printf("%lld\n",find(ll,rr,k));

}return 0;

}

第k大數 兩個陣列元素相乘後的第k大

分析 二分,兩邊夾,細節見 複雜度為o 2nlog maxa maxb 一 include include include include using namespace std typedef long long ll const int maxn 100010 ll a maxn b maxn ...

Google面試題 陣列中第K小的數字

題目1534 陣列中第k小的數字 時間限制 2 秒 記憶體限制 128 兆 特殊判題 否 提交 682 解決 105 題目描述 給定兩個整型陣列a和b。我們將a和b中的元素兩兩相加可以得到陣列c。譬如a為 1,2 b為 3,4 那麼由a和b中的元素兩兩相加得到的陣列c為 4,5,5,6 現在給你陣列...

leetcode 面試題14 兩陣列第K個值

題目 兩個有序陣列a和b,分別擁有m和n的長度,求其合併後的第k個值.使用二分的方法。演算法思想在 注釋中 int findkthelm int a,int abeg,int aend,int b,int bbeg,int bend,int k if bbeg bend 取中間位置 int amid...