简历投递一天

This commit is contained in:
Estom
2021-08-23 22:53:15 +08:00
parent 4ed6ee6517
commit fb01b19088
7 changed files with 304 additions and 13 deletions

View File

@@ -0,0 +1,99 @@
class Solution {
public:
double findone(vector<int>&nums){
int n = nums.size();
if(n==1)return nums[0];
if(n%2==1){
return nums[(n-1)/2];
}
else{
// cout<< nums[(n-1)/2]<<endl;
return (nums[(n-1)/2]+nums[(n-1)/2+1])/2;
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n1 = nums1.size(),n2=nums2.size();
int i=0,j=0,n=n1+n2;
while(i+j<n/2){
if(nums1[i]<nums2[j] && i<n1 || j>=n2){
i++;
}
else if(j<n2){
j++;
}
}
}
double findMedianSortedArrays2(vector<int>& nums1, vector<int>& nums2) {
// 一种新的二分查找。每次排除掉两个数组的1/4。直接扫描两遍也行这个数据规模爆搜吧。
int n1 = nums1.size(),n2=nums2.size();
int l1=0,m1=0,r1=n1-1;
int l2=0,m2=0,r2=n2-1;
m1 = (l1+r1)/2;
m2 = (l2+r2)/2;
int n = n1+n2;
int *m,*l,*r;
// 特殊情况的讨论
if(n1==0){
return findone(nums2);
}
if(n2==0){
return findone(nums1);
}
if(n1==1){
nums2.push_back(nums1[0]);
sort(nums2.begin(),nums2.end());
return findone(nums2);
}
if(n2==1){
nums1.push_back(nums2[0]);
sort(nums1.begin(),nums1.end());
// for(auto a : nums1){
// cout<<a<<" ";
// }
return findone(nums1);
}
// 保证左边的元素小于等于右
while(true){
// 终止搜索的条件。l1和l2不需要相邻。都完成二分搜索后只剩下两个数。
if(r1-l1<=1 && r2-l2<=1){
cout<<l1<<" "<<r1<<" "<<l2<<" "<<r2<<endl;
vector<int> temp{nums1[l1],nums1[r1],nums2[l2],nums2[r2]};
sort(temp.begin(),temp.end());
int left = l1+l2;
int right = n-r1-r2-2;
int index = ((right-left)+3)/2;
if(n%2==1){
return temp[index];
}
else{
return (temp[index]+temp[index+1])/2.0;
}
}
// 继续搜索排除掉1/4的方法.暂不考虑相等
// 选择做二分的数组
if(nums1[m1]<nums2[m2] && m1+m2<n/2 && r1-l1>1 || nums1[m1]>nums2[m2] && m1+m2>n/2 && r1-l1>1){
m = &m1;
l=&l1;
r=&r1;
}else if(r2-l2>1){
m = &m2;
l = &l2;
r = &r2;
}
if(m1+m2<n/2){
*l = *m;
*m = (*l+*r)/2;
}
else{
*r = *m;
*m = (*l+*r)/2;
}
}
return 1;
}
};