double 数组_寻找两个有序数组的中位数
生活随笔
收集整理的這篇文章主要介紹了
double 数组_寻找两个有序数组的中位数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大家好,我是老皮;
題目地址:https://leetcode.com/problems/median-of-two-sorted-arrays/
題目描述:
給定兩個大小為 m 和 n 的有序數組 nums1 和 nums2。請你找出這兩個有序數組的中位數,并且要求算法的時間復雜度為 O(log(m + n))。你可以假設 nums1 和 nums2 不會同時為空。示例 1:nums1 = [1, 3]nums2 = [2]則中位數是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]則中位數是 (2 + 3)/2 = 2.來源:力扣(LeetCode)鏈接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。思路:
首先了解一下Median的概念,一個數組中median就是把數組分成左右等分的中位數。如下圖:這道題,很容易想到暴力解法,時間復雜度和空間復雜度都是 O(m+n), 不符合題中給出 O(log(m+n))時間復雜度的要求。我們可以從簡單的解法入手,試了一下,暴力解法也是可以被Leetcode Accept的. 分析中會給出兩種解法,暴力求解和二分解法。01解法一:暴力 (Brute Force)
暴力解主要是要merge兩個排序的數組 (A,B)成一個排序的數組。用兩個 pointer(i,j), i 從數組 A起始位置開始,即 i=0開始, j 從數組 B起始位置, 即 j=0開始. 一一比較 A[i]和B[j]解法二:二分查找 (Binary Search)
由于題中給出的數組都是排好序的,在排好序的數組中查找很容易想到可以用二分查找(Binary Search)。這里對數組長度小的做二分, 保證數組A 和 數組B 做partition 之后,len(Aleft)+len(Bleft)=(m+n+1)/2-m是數組A的長度,n是數組B的長度,對數組A的做partition的位置是區間 [0,m]。如圖:下圖給出幾種不同情況的例子(注意但左邊或者右邊沒有元素的時候,左邊用 INF_MIN,右邊用 INF_MAX表示左右的元素:下圖給出具體做的partition 解題的例子步驟:時間復雜度:O(log(min(m,n))-mislength of A,nislength of B空間復雜度:O(1) - 這里沒有用額外的空間。03關鍵點分析
- 要partition兩個排好序的數組成左右兩等份,partition需要滿足?len(Aleft)+len(Bleft)=(m+n+1)/2 - m是數組A的長度, n是數組B的長度
- 并且partition后 A左邊最大(?maxLeftA), A右邊最小(?minRightA), B左邊最大(?maxLeftB), B右邊最小(?minRightB) 滿足?(maxLeftA <= minRightB && maxLeftB <= minRightA)
04
代碼(Java code)
解法一:暴力解法(Brute force)class?MedianTwoSortedArrayBruteForce?{public?double?findMedianSortedArrays(int[]?nums1,?int[]?nums2)?{int[]?newArr?=?mergeTwoSortedArray(nums1,?nums2);int?n?=?newArr.length;if?(n?%?2?==?0)?{//?evenreturn?(double)?(newArr[n?/?2]?+?newArr[n?/?2?-?1])?/?2;}?else?{//?oddreturn?(double)?newArr[n?/?2];}}private?int[]?mergeTwoSortedArray(int[]?nums1,?int[]?nums2)?{int?m?=?nums1.length;int?n?=?nums2.length;int[]?res?=?new?int[m?+?n];int?i?=?0;int?j?=?0;int?idx?=?0;while?(i?m?&&?j?if?(nums1[i]?<=?nums2[j])?{??????????res[idx++]?=?nums1[i++];}?else?{??????????res[idx++]?=?nums2[j++];}}while?(i?m)?{????????res[idx++]?=?nums1[i++];}while?(j?return?res;}}解法二:二分查找(Binary Search)class MedianSortedTwoArrayBinarySearch {public static double findMedianSortedArraysBinarySearch(int[] nums1, int[] nums2) {// do binary search for shorter length array, make sure time complexity log(min(m,n)).if (nums1.length > nums2.length) {return findMedianSortedArraysBinarySearch(nums2, nums1);}int m = nums1.length;int n = nums2.length;int lo = 0;int hi = m;while (lo <= hi) {// partition A position iint i = lo + (hi - lo) / 2;// partition B position jint j = (m + n + 1) / 2 - i;int maxLeftA = i == 0 ? Integer.MIN_VALUE : nums1[i - 1];int minRightA = i == m ? Integer.MAX_VALUE : nums1[i];int maxLeftB = j == 0 ? Integer.MIN_VALUE : nums2[j - 1];int minRightB = j == n ? Integer.MAX_VALUE : nums2[j];if (maxLeftA <= minRightB && maxLeftB <= minRightA) {// total length is evenif ((m + n) % 2 == 0) {return (double) (Math.max(maxLeftA, maxLeftB) + Math.min(minRightA, minRightB)) / 2;} else {// total length is oddreturn (double) Math.max(maxLeftA, maxLeftB);}} else if (maxLeftA > minRightB) {// binary search left half hi = i - 1;} else {// binary search right half lo = i + 1;}}return 0.0;}}總結
以上是生活随笔為你收集整理的double 数组_寻找两个有序数组的中位数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中文显示不出来_Python
- 下一篇: zigbee的路由器能分配网络地址吗_网