日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试题:找两个有序数组所有数第K小的数

發布時間:2023/12/20 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试题:找两个有序数组所有数第K小的数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定兩個有序數組arr1和arr2,再給定一個整數k,返回兩個數組中所有數中第k小的數。要求:如果arr1的長度為N,arr2的長度為M,時間復雜度請達到O(log(min{M, N}) )

例如: arr1 = {1,2,3,4,5} arr2 = {3,4,5} k = 1; 因為1為所有數中最小的,所以返回1 arr1 = {1,2,3} arr2 = {3,4,5,6} k = 4 因為3為所有數中第4小的數,所以返回3 #include <iostream> #include <assert.h> #include <vector> using namespace std;int FindKthNum(int* arr1, int len1, int* arr2, int len2, int k) {assert(k >= 0 && len1 + len2 >= k);if(len1 > len2){return FindKthNum(arr2, len2, arr1, len1, k);}if(len1 == 0)return arr2[k-1];if(k == 1)return min(arr1[0], arr2[0]); int range1 = min(k/2, len1), range2 = k - range1;// arr1[0,range1) + arr2[0,range2) 是兩個數組的前k個數// 1.arr1[range1-1] == arr2[range2-1],則這個兩個數其中一個就是第k個// 2.arr1[range1-1] < arr2[range2-1],則排除arr1[0,range1)這一部分// 3.arr1[range1-1] > arr2[range2-1],則排除arr2[0,range2)這一部分if(arr1[range1-1] == arr2[range2-1])return min(arr1[range1-1], arr2[range2-1]);else if(arr1[range1-1] < arr2[range2-1])//去掉range1個return FindKthNum(arr1+range1, len1-range1, arr2, len2, k-range1);elsereturn FindKthNum(arr1, len1, arr2+range2, len2-range2, k-range2);}void test() {int a1[5] = {1,2,3,4,5};int a2[3] = {3,4,5};cout<<FindKthNum(a1, 5, a2, 3, 1)<<endl;int a11[3] = {1,2,3};int a22[4] = {3,4,5,6};vector<int> arr11(a11, a11+3);vector<int> arr22(a22, a22+4);cout<<FindKthNum(a11, 3, a22, 4, 4)<<endl; }

總結

以上是生活随笔為你收集整理的面试题:找两个有序数组所有数第K小的数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。