leetcode 4. 瀵绘壘涓や釜姝e簭鏁扮粍鐨勪腑浣嶆暟

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 4. 瀵绘壘涓や釜姝e簭鏁扮粍鐨勪腑浣嶆暟相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/kth' title='kth'>kth   -o   amp   鐩存帴   ndk   return   code   

4. 瀵绘壘涓や釜姝e簭鏁扮粍鐨勪腑浣嶆暟

缁欏畾涓や釜澶у皬涓?m 鍜?n 鐨勬搴忥紙浠庡皬鍒板ぇ锛夋暟缁?nums1 鍜?nums2銆?/p>

璇蜂綘鎵惧嚭杩欎袱涓搴忔暟缁勭殑涓綅鏁帮紝骞朵笖瑕佹眰绠楁硶鐨勬椂闂村鏉傚害涓?O(log(m + n))銆?/p>

浣犲彲浠ュ亣璁?nums1?鍜?nums2?涓嶄細鍚屾椂涓虹┖銆?/p>

鏉ユ簮锛氬姏鎵o紙LeetCode锛?br> 閾炬帴锛?a href="https://leetcode-cn.com/problems/median-of-two-sorted-arrays">https://leetcode-cn.com/problems/median-of-two-sorted-arrays
钁椾綔鏉冨綊棰嗘墸缃戠粶鎵€鏈夈€傚晢涓氳浆杞借鑱旂郴瀹樻柟鎺堟潈锛岄潪鍟嗕笟杞浇璇锋敞鏄庡嚭澶勩€?br> 鎶€鏈浘鐗? src=

瑙i鎬濊矾锛?br> 瀵绘壘鏁扮粍涓殑涓綅鏁帮紝鍗宠浆鍖栦负瀵绘壘鏈夊簭鏁扮粍鐨勭k灏忔暟闂锛堢k灏忕殑鏁板嵆涓轰腑浣嶆暟锛?br> 棰樼洰瑕佹眰鏃堕棿澶嶆潅搴锛坙og锛坢+n锛夛級鏄剧劧閲囩敤浜屽垎娉曪紝姝ら閲囩敤鏄姌鍗婂垹闄ゆ壘绗琸灏忔暟
鎶€鏈浘鐗? src=
闂锛氫负浠€涔堝彲浠ョ洿鎺ュ垹闄ょ涓€涓暟缁勪腑鐨勫墠k/2涓暟鍛紵
鎴戜滑瑕佸鎵剧殑鏄綋鍓嶄袱涓湁搴忔暟缁勪腑鐨勭k灏忕殑鏁帮紝鏄剧劧閫氳繃姣旇緝鍙互鍒ゆ柇鍑哄墧闄ょ殑k/2涓暟涓€瀹氬湪绗琸灏忔暟鐨勫乏杈?鍙互鐩存帴鍓旈櫎
璇佹槑锛?br> 璁句袱涓暟缁勬€诲厓绱犱釜鏁颁负n
鍥犱负鏁扮粍涓烘湁搴忛€掑鏁扮粍锛岃璇佹槑鎵€鍓旈櫎鐨勬暟閮藉湪绗琸灏忔暟宸﹁竟锛屽彧闇€璇佹槑鍓旈櫎鐨勬暟涓殑鏈€澶ф暟鍦ㄧk灏忔暟鐨勫乏杈癸紝鍗宠瘉鏄庡湪璇ユ暟鍙宠竟鐨勫厓绱犱釜鏁板ぇ浜庣瓑浜庯紙n-k+1锛?br> 鍥犱负nums1[k/2-1]<nums2[k/2-1]鏃讹紝涓や釜鏁扮粍涓嚦灏戞湁n-(k/2)2+1涓暟澶т簬绛変簬nums1[k/2-1]
鍙堝洜涓簁>=(k/2)
2
鎵€浠-(k/2)*2+1>=n-k+1
鎵€浠ュ湪nums1[k/2-1]鍙宠竟鐨勫厓绱犱釜鏁板ぇ浜庣瓑浜庯紙n-k+1锛?br> 鎵€浠ユ垜浠槸鍙互鐩存帴鍓旈櫎閭d簺鏁扮殑

涓嶆柇杩涜鎶樺崐鍓旈櫎锛岀洿鍒発=1鏃讹紝鍗充腑浣嶆暟鏄綋鍓嶆暟缁勫墿浣欐暟涓殑鏈€灏忔暟鏃讹紝鐩存帴姣旇緝涓や釜鏁扮粍涓綋鍓嶇殑绗竴涓暟锛堝嵆鏈€灏忔暟锛夊彇杈冨皬鐨勬暟鍗充负涓綅鏁?br> 浠g爜濡備笅

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size(),m=nums2.size();
        int k1=(n+m+1)/2,k2=(n+m+2)/2;//褰搉+m涓哄鏁版椂k1=k2;
        return (findKth(nums1,0,n-1,nums2,0,m-1,k1)+findKth(nums1,0,n-1,nums2,0,m-1,k2))/2.0;//褰搉+m涓哄鏁版椂鍗冲彇鍒扮殑鍚屼竴涓暟锛宯+m涓哄伓鏁板嵆涓や釜鏁板彇骞冲潎
    }
    int findKth(vector<int>&nums1,int le1,int ri1,vector<int>&nums2,int le2,int ri2,int k){
        int length1=ri1-le1+1;
        int length2=ri2-le2+1;
        if(length1>length2) return findKth(nums2,le2,ri2,nums1,le1,ri1,k);//淇濊瘉绗竴涓暟缁勬瘮绗簩涓暟缁勭煭
        if(length1==0) return nums2[le2+k-1];//褰撶涓€涓暟缁勪负绌烘椂锛岀洿鎺ヤ粠绗簩涓暟缁勫彇绗琸灏忔暟
        if(k==1) return min(nums1[le1],nums2[le2]); 
        int i=min(k/2,length1);
        int j=min(k/2,length2);
        if(nums1[le1+i-1]>nums2[le2+j-1]){
            return findKth(nums1,le1,ri1,nums2,le2+j,ri2,k-j);
        }
        else{
            return findKth(nums1,le1+i,ri1,nums2,le2,ri2,k-i);
        }
    }
};









以上是关于leetcode 4. 瀵绘壘涓や釜姝e簭鏁扮粍鐨勪腑浣嶆暟的主要内容,如果未能解决你的问题,请参考以下文章

鏁扮粍鐨勫唴瀛樺浘

8.4 鎵惧埌鏃犲簭鏁扮粍涓渶灏忕殑k涓暟

Repeats SPOJ - REPEATS(鍚庣紑鏁扮粍瑙e喅閲嶅娆℃暟鏈€澶氱殑杩炵画閲嶅瀛愪覆)

[LeetCode] 255. Verify Preorder Sequence in Binary Search Tree 楠岃瘉浜屽弶鎼滅储鏍戠殑鍏堝簭搴忓垪

[LeetCode] 954. Array of Doubled Pairs 涓ゅ€嶆暟瀵瑰効鏁扮粍