問題描述:
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
我的解答:
packagecn;import
j**a.util.scanner;
public
class
calmedianarray
system.out.println("請輸入第二個陣列:(用逗號隔開)");
string s2 =sc.nextline();
string split2 = s2.split(",");
int arr2 = new
int[split2.length];
for (int i = 0; i < split2.length; i++)
double medium =calmedian(arr, arr2);
system.out.println("兩個陣列的中位數為:" +medium);
}private
static
double calmedian(int num1, int
num2)
if (num1[i] >num2[j])
if (num1[i] ==num2[j])
} else
if (i >=m)
else
}//(m+n)為奇數時
if (l % 2 != 0) return
mid;
else
return (last + mid) / 2.0;
}}
執行結果不正確!!!
分析:
(1)預設的是從小到大的順序,我模仿以前合併兩個有序鍊錶的思路,想著兩兩比較得到最大值,然後將較小值的索引往後移一位,繼續比較。
(2)因為合併後的鍊錶長度可能為奇數也可能為偶數,所以每次不僅對mid賦值,也對last賦值,如果是偶數則返回(last+mid)/2。
(3)該演算法不正確的原因是,我從一開始就犯了乙個錯誤:兩兩比較得到的最小值一定比後面所有值都小,但是兩兩比較的最大值有可能比後面幾個值都大,這樣把最大值賦值給mid就是錯誤的!
舉個例子:
num1: 2,3,5
num2: 1,6,8,9
正確的mid順序應該是:2,3,5,6,8,9
但是2和6比較直接將6作為mid,順序就變成:2,3,6,6,8,9
解決思路:
仍然兩兩比較得到最小值,作為新鍊錶的值,再獲得中位數
privatestatic
double calmedian(int num1, int
num2)
else
}else
if(i >= m && j else
if(i }
//(m+n)為奇數時
if (l % 2 != 0) return (double) num3[l / 2];
//偶數
else
return (num3[l / 2] + num3[l / 2 - 1]) / 2.0;
}
分析:
這種演算法雖然能做出來,但是時間複雜度為o(m+n),不滿足條件!!
正確解答:
classsolution
int amin = 0; //
a 陣列折半查詢左邊界
int amax = la; //
a 陣列折半查詢右邊界
//halflen 的作用就是中點座標,當 a 陣列中折半查詢向右移動時,b 陣列以 halflen 為相對點向左移動,以保持始終均分
int halflen = (la + lb + 1) >> 1;
//二分查詢
//情況一: a 陣列為空,中位數在 b 陣列
//情況二: a 陣列較短
//1) a 陣列元素都較小,中位數在b陣列
//2) a 陣列元素都較大,中位數在b陣列
//3) a、b 元素大小分布基本相當,中位數為被分割的兩陣列左半部分較大的那乙個和右半部分較小的那乙個之和的一半
//情況三: a、b 等長
//1) a 陣列元素都比b陣列元素小,中位數為 a 陣列尾元素和b陣列首元素之和的一半
//2) b 陣列元素都比a陣列元素小,中位數為 b 陣列尾元素和a陣列首元素之和的一半
//3) a、b 元素大小分布基本相當,中位數為被分割的兩陣列左半部分較大的那乙個和右半部分較小的那乙個之和的一半
while (amin <=amax) else
if (aindex < amax && b[bindex - 1] >a[aindex]) else
else
if (bindex == 0) else
//元素個數總和為奇數
if ((la + lb) % 2 == 1)
//情況一: a 陣列為空,中位數在 b 陣列
//情況二: a 陣列較短
//1) a 陣列元素都較小,中位數在b陣列
//2) a 陣列元素都較大,中位數在b陣列
//3) a、b 元素大小分布基本相當,中位數為被分割的兩陣列左半部分較大的那乙個和右半部分較小的那乙個之和的一半
//情況三: a、b 等長
//1) a 陣列元素都比b陣列元素小,中位數為 a 陣列尾元素和b陣列首元素之和的一半
//2) b 陣列元素都比a陣列元素小,中位數為 b 陣列尾元素和a陣列首元素之和的一半
//3) a、b 元素大小分布基本相當,中位數為被分割的兩陣列左半部分較大的那乙個和右半部分較小的那乙個之和的一半
//元素個數總和為偶數
int rightpart = 0;
//情況一,情況二1
if (aindex ==la) else
if (bindex ==lb) else
return (leftpart + rightpart) / 2.0;}}
return 0;
}}
分析:感覺自己還不是很懂,今天太晚了,等有時間再來看一看。
Leetcode題目之兩個陣列的中位數
先來看題目描述 there are two sorted arraysnums1andnums2of size m and n respectively.find the median of the two sorted arrays.the overall run time complexity ...
04尋找兩個陣列的中位數
from typing import list class solution def findmediansortedarrays self,nums1 list int nums2 list int float 這樣寫可以不用判斷兩個陣列和為奇數和偶數的情況 index1 len nums1 le...
LeetCode 兩個排序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 示例 1 nums1 1,3 nums2 2 中位數是 2.0示例 2 nums1 1,2 nums2 3,4 中位數是 2 3 2 2.5 package...