Leetcode 문제풀이 4.Median of Two Sorted Arrays
Leetcode 문제
4.Median of Two Sorted Arrays-Hard
Author: Zinc 키워드: 분할, 귀속, 2분
제목
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)).
중국어 약술
두 개의 질서수 그룹인nums1과nums2가 있는데 길이는 각각 n과 m로 두 그룹이 합쳐진 중위수를 찾아낸다.특별 요구사항: 시간 복잡도 O(log(m+n)
분석
선형 시간: 제목을 보면 누군가가 말하기 시작한다. 이 문제는 간단하잖아. 두 개의 질서수 그룹을 하나의 질서수 그룹으로 통합한 다음에 중위수의 정의를 사용한다. 중위수는 질서수 그룹의 중간에 있는 그 수(길이가 홀수)나 중간 두 개의 수의 평균수(길이가 짝수일 때)이다.원래 주어진 두 개의 수조는 이미 질서정연한 수조이기 때문에 우리는 병합 정렬의 조작과 같이 한 걸음만 하면 된다. 시간의 복잡도는 m+n이고 선형으로 한 번씩 차례를 배열하면 된다.마지막으로 공식으로 전체 단계는 m+n+1걸음이고 시간 복잡도는 O(m+n)이다. 선형의 시간은 이미 우수한 것 같아서 제목은 완벽한 마침표를 그린다."야야야, 너 눈 멀었어... 제목이 log(m+n)의 시간을 쓰라고 했구나!"(퀴즈를 맞힐 때 옆에서 조롱이 들려온다)"뭐야! 야옹? 야옹? 야옹?"(이때의 내 얼굴은 흑인 물음표), 눈을 똑바로 뜨고 보니 정말log(m+n), 하늘이 누구를 돌아다녔는지.역시 이 하드의 제목은 만만한 것이 아니다.
대수 시간 분석: 대수 시간을 보면 많은 사람들이 나와 같다고 믿는다. 처음에는 어리둥절했는데 어떻게 하지?사실 시간을 세는 점에 대해 말하자면 이렇게 빠른 알고리즘에 도달할 수 있는 것은 많지 않고 가장 흔히 볼 수 있는 것은 이분의 사상이다.자, 2분을 절입점으로 아래로 확장한다. 이른바 중위수를 찾는 것은 사실 제2k=len/2(상향으로 정돈)의 수나 k=len/2와 k=len/2+1의 두 수의 평균수를 찾는 것이다. 문제는 2개의 질서수 그룹 중 두 번째로 큰 숫자를 찾는 것으로 바뀌었고 2분을 통해 두 개의 수조의 규모를 줄인다.우리가 문제를 풀 수 있는 코드를 얻었다.간단한 절차는 다음과 같다.좌우 양쪽에서 두 번째로 큰 K를 찾습니다.각각 두 개의 수조 k/2 위치의 숫자를 찾아 비교한다. 만약에 a1[k/2]>a2[k/2]가 설명하면 a1 전 k/2는 수소 범위 밖에 있고 반대로 a2의 전 k/2이다.(k/2의 길이와 a1의 길이를 최소화하는 알고리즘; a1이 숫자가 없으면 답이 b에 있고 같으면 답이 같은 숫자이다.)삼.상황1은 a1을 전 k/2를 제거하고 두 개의 수조 중 k/2가 큰 숫자를 검색합니다. 상황2는 a2가 전 k/2를 제거하고 두 개의 수조 중 k/2가 큰 숫자를 검색합니다.
Source Code
1. 합병
class Solution {
public:
double med_singlevec(vector<int>& nums){
int len = nums.size();
int mid = len/2;
return ((len%2==0)? ((nums[mid]+nums[mid-1])/2.0) : nums[mid]);
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int i = 0, j = 0;
vector<int> nums;
for(i = 0, j = 0; i<nums1.size()&&j<nums2.size();){
if(nums1[i]<=nums2[j]){
nums.push_back(nums1[i++]);
}
else
nums.push_back(nums2[j++]);
}
while(i<nums1.size())
nums.push_back(nums1[i++]);
while(j<nums2.size())
nums.push_back(nums2[j++]);
return med_singlevec(nums) ;
}
2.2분치
#include <cmath>
class Solution {
public:
double findKthnum(vector<int>&a, vector<int>&b, int k){
int alen = a.size(), blen = b.size();
if(alen > blen)
return findKthnum(b, a, k);
if(alen==0)
return b[k-1];
if(k==1)
return min(a[0],b[0]);
int pa = min(k/2, alen);
int pb = k - pa;
if(a[pa-1] < b[pb-1]){
vector<int>*na = new vector<int>(a.begin()+pa, a.begin()+alen);
return findKthnum(*na,b,k-pa);
}
else if(a[pa-1] > b[pb-1]){
vector<int>* nb = new vector<int>(b.begin()+pb,b.begin()+blen);
return findKthnum(a,*nb,k-pb);
}
else
return a[pa-1];
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int total = nums1.size()+nums2.size();
if(total % 2 == 1){
return findKthnum(nums1, nums2, total/2 +1);
}
else{
return (findKthnum(nums1, nums2, total/2)+
findKthnum(nums1, nums2, total/2+1))/2.0;
}
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.