Encuentre el késimo número más grande en la matriz, optimice la solución

Cuando k no es muy grande, puede atravesar directamente la matriz y guardar datos con variables temporales

Ejemplo: Encuentre la solución O (n) del segundo número más grande en una matriz

#include <iostream>
using namespace std;

int two_rank(int* arr, int len){
    int min = 0;
    int two_min = 0;
    if(len < 2)return -1;
    for(int i = 0; i < len; i++){
        if(i == 0){
            min = arr[0];
        }else if(i == 1){
            if(arr[1] < min){
                two_min = min;
                min = arr[1];
            }else{
                two_min = arr[1];
            }
        }else{
            if(arr[i] < min){
                two_min = min;
                min = arr[i];
            }else if(arr[i] >= min && arr[i] < two_min){
                two_min = arr[i];
            }else{
                continue;
            }
        }   
    }
    return two_min;
}

int main(){
    int arr[] = {123, 241, 222, 12, 567, 222, 12234, 22};
    int len = sizeof(arr)/sizeof(arr[0]);

    int ret = two_rank(arr, len);

    cout << ret << '\n';
    return 0;
}

Cuando k no está seguro, use el código de partición de movimiento rápido optimizado

#include <iostream>
using namespace std;

void mid_three(int* arr, int left, int right){
    int mid = left + ((right-left) >> 1);
    if(arr[left] > arr[right]){
        int temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
    }
    if(arr[left] > arr[mid]){
        int temp = arr[left];
        arr[left] = arr[mid];
        arr[mid] = temp;
    }
    if(arr[mid] > arr[right]){
        int temp = arr[mid];
        arr[mid] = arr[right];
        arr[right] = temp;
    }
    int temp = arr[left];
    arr[left] = arr[mid];
    arr[mid] = temp;
}

int partition(int* arr, int left, int right){
    mid_three(arr, left, right);
    int temp = arr[left];
    while(left < right){
        while(arr[right] >= temp && left < right){
            right--;
        }
        arr[left] = arr[right];
        while(arr[left] <= temp && left < right){
            left++;
        }
        arr[right] = arr[left];
    }
    arr[left] = temp;
    return left;
}

int k_rank(int* arr, int left, int right, int k){
    while(left < right){
        int pivod = partition(arr, left, right);
        if(pivod < k - 1){
            left = pivod + 1;
        }else if(pivod = k - 1){
            return arr[pivod];
        }else{
            right = pivod - 1;
        }
    }
}

int main(){
    int arr[] = {123, 241, 222, 12, 567, 222, 12234, 22};
    int len = sizeof(arr)/sizeof(arr[0]);
    int ret = k_rank(arr, 0, len-1, 4);
    cout << ret << '\n';

    return 0;
}
21 artículos originales publicados · Me gusta0 · Visitas 163

Supongo que te gusta

Origin blog.csdn.net/qq_45227330/article/details/105426335
Recomendado
Clasificación