leetcode 兩個陣列中位數

2022-09-11 21:15:28 字數 3322 閱讀 9728

問題描述:

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。

你可以假設 nums1 和 nums2 不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

我的解答:

package

cn;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

解決思路:

仍然兩兩比較得到最小值,作為新鍊錶的值,再獲得中位數

private

static

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),不滿足條件!!

正確解答:

class

solution

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...