(java)求兩個排序陣列(升序)中第K小的數
如題:求兩個排好序的陣列的第K個小的數
思路一:歸併兩個有序陣列,按照順序合併,最後找到第K-1位置的數。時間複雜度為O(N)
思路二:在技術部落格上看到更好的思路,時間複雜度是OLog(m+n);
第k小的數字為x,那麼陣列1一定有i個數字小於x,陣列2一定有j個數字小於x,注意i+j=k-1。因為k已知,所以我們只要搜尋i即可。然後我們可以想象到,如果元素array1[i+1]為兩個陣列的並的第k小的數字的話,那麼它滿足
arrary1[i+1] >= array2[j] && array1[i+1]<=array2[j+1]。同理如果array2[j+1]為兩個陣列的並的第k小的數字的話,那麼它滿足 arrary2[j+1] >= array1[i] && array2[j+1]<=array1[i+1]。二分搜尋陣列1的i,並對照陣列2對應的j,如果array1[i]的值太大,搜尋陣列1的i的前半區間,否則搜尋後半區間。
程式碼如下:
public static double findMedianSortedArrays(int[] nums1, int[] nums2,int k) { int m=nums1.length; int n=nums2.length; return f(nums1,m,nums2,n,k); } public static int f(int[] a,int m,int[] b,int n,int k){ if(m>n){ return f(b,n,a,m,k); } if(m==0){ return b[k-1]; } if(k==1){ return Math.min(a[k-1], b[k-1]); } int pa=Math.min(k/2, m); int pb=k-pa; if(a[pa-1]<b[pb-1]){ int[] temp=new int[m-pa]; for(int i=pa,j=0;i<m;i++){ temp[j++]=a[i]; } return f(temp,m-pa,b,n,k-pa); } else if(a[pa-1]>b[pb-1]){ int[] temp=new int[n-pb]; for(int i=pb,j=0;i<n;i++){ temp[j++]=b[i]; } return f(a,m,temp,n-pb,k-pb); } else{ return a[pa-1]; } }
相關推薦
(java)求兩個排序陣列(升序)中第K小的數
如題:求兩個排好序的陣列的第K個小的數 思路一:歸併兩個有序陣列,按照順序合併,最後找到第K-1位置的數。時間複雜度為O(N) 思路二:在技術部落格上看到更好的思路,時間複雜度是OLog(m+n); 第k小的數字為x,那麼陣列1一定有i個數字小於x,陣列2一定有j個數字小於
利用分治法來求兩個排序陣列的中位數
有兩個陣列 ar1[] 和ar2[] 兩個陣列的長度都為n 求ar1[]和ar2[]的中位數 可以借鑑歸併排序的思想 實質上就是將將兩個已經排好序的陣列 合併成一個數組 的過程只是在這個過程中添加
求兩個排序陣列的中位數
設X[1...n]和Y[1...n]為兩個陣列,每個都包含n個已排序好的數。給出一個求陣列X和Y中所有2n個元素的中位數的、O(lgn)時間的演算法。 演算法思想: 1.兩個陣列中小於median的個數為(n - 1)個,假設該median為陣列a中的第k個,k為陣
從兩個有序陣列的並集中尋找第k小元素
問題描述: 給定兩個有序陣列(從小到大),找到在合併陣列中第K小的元素。假設無重複元素。 問題求解: 方法一:時間複雜度O(m+n),空間複雜度O(m+n) 將兩個陣列進行合併,然後尋找第k小的元素。合併操作需要花費額外的O(m + n)空間。依次將當前
LeetCode|4.兩個排序陣列的中位數(Java)
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(log (m+n)) 。示例 1:nums1 = [1, 3] nums2 = [2] 中位數是 2.0 示例 2:nums1 = [1, 2]
leetcode 兩個排序陣列的中位數(Median of Two Sorted Arrays)
解決方案 方法:遞迴法 為了解決這個問題,我們需要理解“中位數的作用是什麼”。在統計中,中位數被用來: 將一個集合劃分為兩個長度相等的子集,其中一個子集中的元素總是大於另一個子集中的元素。 如果理解了中位數的劃分作用,我們就很接近答案了。 首先,讓我們在任一位置
leetcode演算法題—golang—兩個排序陣列的中位數(題4)
題目:兩個排序陣列的中位數 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 。 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(log (m+n)) 。 你可以假設 nums1 和 nums2 不同時為空。 示例 1: nums1 =
合併兩個有序陣列(歸併排序)
package com.zyt.interview; public class MergeSortArray { public static int[] sort(int[] a,int[]
LeetCode之旅(C/C++):4. 兩個排序陣列的中位數
PS:不明之處,請君留言,以期共同進步! 1、題目描述 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 。 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(lo
JAVA實現合併兩個排序的連結串列(《劍指offer》)
題目描述 輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。 解答: /* public class ListNode {
leetcode 4.兩個排序陣列的中位數 (python)
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(log (m+n)) 。程式碼如下class Solution(object): def findMedianSortedArrays(self, nums1, nums2
LeetCode 88. 合併兩個有序陣列(java 實現)
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n
4. Median of Two Sorted Arrays(兩個排序陣列的中位數)
有兩個大小為 m 和 n 的排序陣列 nums1 和 nums2 。 請找出兩個排序陣列的中位數並且總的執行時間複雜度為 O(log (m+n)) 。 示例 1: nums1 = [1, 3] n
劍指offer程式設計題python實現(第16題)合併兩個排序的連結串列
劍指offer程式設計題python實現(第16題)合併兩個排序的連結串列 題目描述 輸入兩個單調遞增的連結串列, 輸出兩個連結串列合成後的連結串列, 當然我們需要合成後的連結串列滿足單調不減規則。 '''題目描述 輸入兩個單調遞增的連結串列, 輸出兩個連結串列合成後的連結串列, 當然我們需
領釦(LeetCode)合併兩個有序陣列 個人題解
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2
劍指offer——(9)合併兩個排序的連結串列
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solutio
(LeetCode每日一刷18) 合併兩個有序陣列
題目描述: 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和&n
【LeetCode】88. 合併兩個有序陣列(Merge Sorted Array)
【 英文練習 | 中文練習 】 題目描述: 給定兩個有序陣列,合併它們,合併之後的陣列依舊有序。 解題思路: 從後向前存放。 public void merge(int[] nums1, int m, int[] nums2, int n) { if(nums
hdoj Intersection 5120 (數學計算幾何) 求兩個相交圓的面積
Intersection Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 1643 Accepted Submis
leetcode(2)尋找兩個有序陣列的中位數的js實現
一.題目描述: 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。 請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 O(log(m + n))。 你可以假設 nums1 和 nums2 不會同時為空。 示例 1: nums1 = [1, 3