C++重学日记 2022年8月2日

60 阅读1分钟

image.png 分析 就是把前面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)

image.png

分析 L/2\lceil L/2 \rceil是向上取整的意思,第L/2\lceil L/2 \rceil个的下标就是(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)