給定兩個大小為 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.5
中位數(median)又稱中值,統計學中的專有名詞,是按順序排列的一組資料中居於中間位置的數,代表乙個樣本、種群或概率分布中的乙個數值,其可將數值集合劃分為相等的上下兩部分。對於有限的數集,可以通過把所有觀察值高低排序後找出正中間的乙個作為中位數。如果觀察值有偶數個,通常取最中間的兩個數值的平均數作為中位數。/*暴力解:先將兩個陣列合併(歸併排序),然後根據奇數還是偶數,返回中位數。(不滿足題目要求)*/
常見排序演算法:
/*暴力解法——合併陣列(歸併排序)*/
class solution
//陣列1
if(len_nums1 == 0 && len_nums2 != 0)else
}//陣列2
if(len_nums2 == 0 && len_nums1 != 0)else
}//兩個陣列都不為空,進行歸併排序合併兩個有序陣列為乙個
int count = 0;
int index1 = 0, index2 = 0;
while(count != (len_nums1 + len_nums2))
break;
}//陣列2已經全部放入,將剩餘陣列1的順序放入
if(index2 == len_nums2)
break;
}//放置資料
if(nums1[index1] < nums2[index2])else
}//判斷總長度,輸出結果
if(count % 2 == 0)else}}
時間複雜度:遍歷全部陣列 (m+n)
空間複雜度:開闢了乙個陣列,儲存合併後的兩個陣列 o(m+n)
/*使用二分方法,將問題轉化為求解兩個陣列中第k大的數字*/
//找到兩個陣列中的第k小的元素
public int find_knum(int nums1, int temp1, int nums2, int temp2, int k)
if(temp2 >= nums2.length)
if(k == 1)
//計算要進行比較的兩個陣列中對應的值,來選擇去除哪一部分
//int 類整數的最大值是 2 的 31 次方 - 1 = 2147483648 - 1 = 2147483647
//可以用 integer.max_value 表示它,即 int value = integer.max_value;
int value = integer.max_value;
int mid1 = (temp1 + k / 2 - 1) < nums1.length ? nums1[temp1 + k / 2 - 1] : value;
int mid2 = (temp2 + k / 2 - 1) < nums2.length ? nums2[temp2 + k / 2 - 1] : value;
//比較兩者的大小,通過遞迴來去除前k/2個元素
if(mid1 < mid2)
return find_knum(nums1, temp1, nums2, temp2 + k / 2, k - k / 2);}}
LeetCode演算法題目 7
題目描述 給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根據這個假設,如果反轉後整數溢位那麼就返回 0。解決方案 反轉整數的方法可以與反轉字串進行模擬。我們想重複 彈出 xx 的最後一位...
LeetCode演算法題目 3
給定乙個字串,找出其中不含有重複字元的最長子串的長度。示例 1 輸入 abcabcbb 輸出 3解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3解釋 因為無重...
leetcode演算法題目 5
給定乙個字串s,找到s中最長的回文子串。可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 暴力解法 1 依據回文串定義,遍歷列舉所有長度大於等於 2的子串,依次判斷是否為回文串 2 針對大於 當前得到的最...