3-4-多数组中位数

题目描述:

  给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数。
  例如:
    arr1 = {1,2,3,4};
    arr2 = {3,4,5,6};
  一共8个数则上中位数是第4个数,所以返回3。

    arr1 = {0,1,2};
    arr2 = {3,4,5};
  一共6个数则上中位数是第3个数,所以返回2。

要求:时间复杂度O(logN)

 1 /*
 2     思路: 二分思路
 3         首先分别找出两个数组arr1和arr2的中位数,分别为mid1,mid2,比较,
 4         1) 如果mid1 == mid2,则该数即为所有数的上中位数。
 5         2) mid1 > mid2时:
 6         若数组长度N为偶数时:
 7           因为mid1>mid2,所以mid2不可能是所有数的上中位数,arr1中mid1后面的数也不可能是上中位数,
 8           此时两个数组就分别筛选掉了一半,然后递归对arr1的前半部分和arr2的后半部分求所有数的上中位数。
 9         若数组长度N为奇数时:
10           因为mid1>mid2,所以mid1不可能是所有数的上中位数,但mid2有可能是,由于球上中位数的两个数组
11           必须等长,因此,我们递归对arr1的前半部分(包括mid1)和arr2的后半部分(包括mid2)求所有数的上中位数。
12         3) mid1 < mid2时的情况和 2)类似。
13 */
14 #include <iostream>
15 #include <vector>
16 using namespace std;
17
18 int findProcess(vector<int> arr1, int l1, int r1, vector<int> arr2, int l2, int r2){
19     if (l1 == r1)
20         return (arr1[l1] < arr2[l2] ? arr1[l1] : arr2[l2]);
21     // 元素个数为奇数,则offset=0;否则offset=1.
22     int offset = ((r1-l1+1)&1) ^ 1;
23     int mid1 = (l1+r1)/2;
24     int mid2 = (l2+r2)/2;
25     if (arr1[mid1] > arr2[mid2])
26         return findProcess(arr1, l1, mid1, arr2, mid2+offset, r2);
27     else if(arr1[mid1] < arr2[mid2])
28         return findProcess(arr1, mid1+offset, r1, arr2, l2, mid2);
29     else
30         return arr1[mid1];
31 }
32
33 int getUpMedian(vector<int> arr1, vector<int> arr2){
34     if (arr1.size() == 0 || arr2.size() == 0 || arr1.size() != arr2.size())
35         return -1;
36     return findProcess(arr1, 0, arr1.size()-1, arr2, 0, arr2.size()-1);
37 }
38
39 int main(){
40     vector<int> a1;
41     a1.push_back(1);
42     a1.push_back(2);
43     a1.push_back(3);
44     a1.push_back(4);
45
46     vector<int> a2;
47     a2.push_back(3);
48     a2.push_back(4);
49     a2.push_back(5);
50     a2.push_back(6);
51     cout << getUpMedian(a1,a2) << endl;
52     return 0;
53 }
时间: 2024-07-28 18:39:35

3-4-多数组中位数的相关文章

【HackerRank】Find the Median(Partition找到数组中位数)

In the Quicksort challenges, you sorted an entire array. Sometimes, you just need specific information about a list of numbers, and doing a full sort would be unnecessary. Can you figure out a way to use your partition code to find the median in an a

无序数组中位数

(1) 最小堆算法 首先将数组的前(n+1)/2个元素建立一个最小堆. 然后,对于下一个元素,和堆顶的元素比较,如果小于等于,丢弃之,接着看下一个元素.如果大于,则用该元素取代堆顶,再调整堆,接着看下一个元素.重复这个步骤,直到数组为空. 当数组都遍历完了,那么,堆顶的元素即是中位数. 1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 const int MAX_SIZE = 100

ACM学习历程—51NOD 1685 第K大区间2(二分 &amp;&amp; 树状数组 &amp;&amp; 中位数)

http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如何判断它是否能成为第k大. 将序列中大于t的置为1,小于t的置为-1,等于t的置为0.那么区间中位数大于t的和就大于0,小于t的就小于0.于是就是判断区间和大于0的个数是否小于等于k. 维护前缀和sum(i),然后统计之前sum(j)小于sum(i)的有多少个,就是以i为右值的区间和大于0的个数.于

2011 找到两个数组中位数

思想:分别求A,B的中位数,若a=吧,则a或b为所求中位数,否则,舍弃a,b中最小者所在序列之较小一半,同时舍弃较大者所在序列较大一半,要求两次舍弃元素个数相同,重复上述过程,直到两个序列中只含一个元素为止,则较小者为所求中位数. 代码: int search(int a[],int b[],int n) { int s1,e1,mid1,s2,e2,mid2; s1=0;e1=n-1;s2=1;e2=n-1; while(s1!=e1||s2!=e2) { mid1=(s1+e1)/2; mi

《LeetCode-0004》 寻找两个有序数组的中位数-Median of Two Sorted Arrays

题目给定两个大小为 m 和 n 的有序数组nums1和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3]nums2 = [2] 则中位数是 2.01234示例 2: nums1 = [1, 2]nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.51234概念中位数的概念:对于有限的数集,可以通过把所有观察值高低排序后找出正中间

貌似基数排序

如给定数组{1,3,51,5,512,671,9,67},设计程序,输出{9,671,67,512,51,5,3,1} 基本思想是给每一位数字定权重,然后使用如W[671] = 6 * w1 + 7 * w2 + 1 * w3;W的个数由数组中位数最长的数字决定.由数组中数字对应的权值来排序即可 程序如下: 1 import java.util.*; 2 import java.math.*; 3 public class Hello { 4 public static List<Integer

No.004:Median of Two Sorted Arrays

题目: There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). Example1:nums1 = [1, 3]nums2 = [2]The median is 2.0Example2:nums1 = [1, 2]n

Pythonic版二分查找

前提:升序数组,待查元素在数组中. 二分查找:就是一个递归函数c.待查元素a,当前数组中位数b,如果b=a则返回b的索引,b>a则在b左侧的子数组中调用函数c,否则在b右侧子数组中调用函数c. 第一次思考,按着上面的思路编程后的结果: def binary_search(index, a, value): if a[(len(a) - 1) // 2] == value: return index + (len(a) - 1) // 2 elif a[(len(a) - 1) // 2] <

基本算法- 七夕祭

题目描述 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ今年举办了一次线下七夕祭.Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11区的夏祭的形式很像.矩形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋--什么的.Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊