LeetCode(4) MedianOfTwoSortedArray
来源:互联网 发布:centos 6删除防火墙 编辑:程序博客网 时间:2024/06/05 09:18
题目:给定两个排好序的数组,如何在O(N+M)的时间复杂度下找到它们的中位数?假设其中一个数组的长度为N,另一个数组的长度为M.
中位数的定义是这样的,如果有N个数从大到小排序,若N为奇数,则中位数为中间那1个数,若N为偶数,则中位数为中间那两个数的平均数。
code如下,按照类似归并排序中得归并的过程来写,写得相当啰嗦。
如果能够另外开辟一个空间来存放归并排序后的新数组,代码应该会简洁一些,不过这样倒是空间和时间都会多用一些了。
//// Solution.h// LeetCodeOJ_002_MedianOf2Array#ifndef LeetCodeOJ_002_MedianOf2Array_Solution_h#define LeetCodeOJ_002_MedianOf2Array_Solution_hclass Solution {public: double findMedianSortedArrays(int A[], int m, int B[], int n) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. int p_a=0; int p_b=0; double median_number=0.0; double median_number_l=0.0; double median_number_r=0.0; if((m+n)%2!=0) {//两个数组的元素数目之和为奇数 int limit=(m+n)/2+1; //下标为(m+n)/2,个数为(m+n)/2+1 int count=0; while((p_a<m)&&(p_b<n)&&(count!=limit)){ if(A[p_a]<=B[p_b]){ median_number=A[p_a]; p_a++; } else{ median_number=B[p_b]; p_b++; } count++; } // std::cout<<"1-1 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl; if(p_a==m) { while((p_b<n)&&(count!=limit)) { median_number=B[p_b]; p_b++; count++; } } // std::cout<<"1-2 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl; if(p_b==n) { while((p_a<m)&&(count!=limit)) { median_number=A[p_a]; p_a++; count++; } } // std::cout<<"1-3 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl; return (double)median_number; } else {//两个数组的元素数目之和为偶数 int limit=(m+n)/2; //media为中间第一个数和中间第二个数的平均数。中间第一个数的下标为(m+n)/2-1,个数为(m+n)/2 int count=0; while((p_a<m)&&(p_b<n)&&(count!=limit)){ if(A[p_a]<=B[p_b]){ median_number_l = A[p_a]; p_a++; } else{ median_number_l = B[p_b]; p_b++; } count++; } //std::cout<<"2-1 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl; // std::cout<<"2-1 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl; if(p_a==m) { while((p_b<n)&&(count!=limit)) { median_number_l = B[p_b]; p_b++; count++; } } //std::cout<<"2-2 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl; //std::cout<<"2-2 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl; if(p_b==n) { while((p_a<m)&&(count!=limit)) { median_number_l = A[p_a]; p_a++; count++; } } //std::cout<<"2-3 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl; //std::cout<<"2-3 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl; if((p_a<m)&&(p_b<n)) { if(A[p_a]<=B[p_b]) median_number_r = A[p_a]; else median_number_r = B[p_b]; } else if(p_a<m){ median_number_r = A[p_a]; } else { median_number_r = B[p_b]; } //std::cout<<"2-4 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl; //std::cout<<"2-4 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl; return (double)(median_number_l+median_number_r)/2; } }};#endif
- LeetCode(4) MedianOfTwoSortedArray
- LeetCode-4
- LeetCode--4
- LeetCode(4)
- LeetCode-4*
- LeetCode(4)
- leetcode 4
- LeetCode #4
- LeetCode(4)
- LeetCode: 4 Sum
- LeetCode: 4Sum
- LeetCode 4Sum
- Leetcode: 4SUM
- 【leetcode】 4 sum
- LeetCode 4Sum
- leetcode 44: 4Sum
- [Leetcode] 4 Sum [Unsolved]
- 【leetcode】4Sum
- openSUSE 163 repo
- PowerShell探秘(5-1)函数返回值的问题
- unix like命令小记
- IIS7.0权限问题
- Google CodeJam习题:Always Turn Left
- LeetCode(4) MedianOfTwoSortedArray
- Recover Binary Search Tree BST找乱序的两个元素 @LeetCode
- [Leetcode 141 & 142, medium] Linked List Cycle (I and II)
- Django 学习笔记(八)
- Django 学习笔记(九)
- 最简单的Windows窗口程序,使用main函数,隐藏控制台等,适合window编程入门
- Spiral Matrix 输出旋转矩阵@LeetCode
- 数组和指针(c专家编程学习笔记)
- 如何压缩vbox磁盘 vdi