分析
就是把前面p个元素,挪到后面
1)
将前p个元素镜像交换,再将剩余的元素镜像交换
最后将所有的的元素镜像交换即可
2)
#include<iostream>
using namespace std;
void leftMove(char A[], int n, int p);
int main() {
char s[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
leftMove(s, 8, 3);
}
void reverse(char r[], int from, int to) {
int temp;
//镜像交换
for (int i = 0; i < (to - from + 1) / 2; ++i) {
temp = r[from + i];
r[from + i] = r[to - i];
r[to - i] = temp;
}
}
void leftMove(char A[], int n, int p) {
reverse(A, 0, p - 1);
reverse(A, p, n - 1);
reverse(A, 0, n - 1);
}
3)时间复杂度O(n),空间复杂度O(1)
分析
是向上取整的意思,第个的下标就是(length-1)/2
1)
先对比两个数组A,B的中位数m1,m2
1.如果m1=m2,则直接返回结果。
2.m1>m2,则A舍弃后面较大的一半,B舍弃前面较小的一半
3.m1<m2,则A舍弃前面较小的一半,B舍弃前面较大的一半
确保A,B长度始终一致,直到都只剩一个数,小的那个就是中位数。
2)如下
#include<iostream>
using namespace std;
int getMidNumber(int A[], int B[], int n);
int main() {
int A1[] = {11, 13, 15, 17, 19};
int B1[] = {2, 4, 6, 8, 20};
int A2[] = {1, 2, 5};
int B2[] = {3, 3, 5};
cout << getMidNumber(A1, B1, 5) << endl;
cout << getMidNumber(A2, B2, 3) << endl;
}
int getMidNumber(int A[], int B[], int n) {
int s1 = 0;
int e1 = n - 1;
int s2 = 0;
int e2 = n - 1;
int m1, m2;
//循环直到只剩一个元素
while (s1 != e1 || s2 != e2) {
//求出当前中位数
m1 = (s1 + e1) / 2;
m2 = (s2 + e2) / 2;
//中位数相等则直接返回结果
if (A[m1] == B[m2]) {
return A[m1];
}
if (A[m1] > B[m2]) { //A的中位数 > B的中位数
//中位数不相等,则删除
if ((e1 - s1 + 1) % 2 == 1) {
//奇数情况
e1 = m1;//保留中位数
s2 = m2;//保留中位数
} else {
//偶数情况
e1 = m1;//删除后半部分时,保留中位数
s2 = m2 + 1;//删除前部分的时候,不保留中位数
}
} else { //B的中位数 > A的中位数
//中位数不相等,则删除
if ((e1 - s1 + 1) % 2 == 1) {
//奇数情况
e2 = m2;//删去后半部分,保留中位数
s1 = m1;//删去前半部分,保留中位数
} else {
//偶数情况
e2 = m2;//删除后半部分时,保留中位数
s1 = m1 + 1;//删除前部分的时候,不保留中位数
}
}
}
return A[s1] < B[s2] ? A[s1] : B[s2];
}
3)时间复杂度:O(logn),空间复杂度O(1)