1. 程式人生 > >(java)求兩個排序陣列(升序)中第K小的數

(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

leetcode2尋找有序陣列位數的js實現

一.題目描述: 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。 請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 O(log(m + n))。 你可以假設 nums1 和 nums2 不會同時為空。 示例 1: nums1 = [1, 3