目录

    • 方法一:使用循环遍历数组
    • 方法二:使用标准库函数 `std::min_element` 和 `std::max_element`
    • 方法三:使用 STL 容器和算法
    • 方法四:使用递归
    • 方法五:使用分治法
    • 方法六:使用 Lambda 表达式和 `std::for_each`

在C++中,查找数组中的最大值和最小值有多种方法。以下是几种常见的方法及其实现思路、代码示例和说明:

方法一:使用循环遍历数组

思路:通过循环遍历数组,逐个比较数组中的每个元素,更新最大值和最小值。

代码示例

#include <iostream>
using namespace std;

void findMaxMin(int arr[], int size, int& max, int& min) {
    max = arr[0];
    min = arr[0];
    for (int i = 1; i < size; ++i) {
        if (arr[i] > max) {
            max = arr[i];
        }
        if (arr[i] < min) {
            min = arr[i];
        }
    }
}

int main() {
    int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    int max, min;
    findMaxMin(arr, size, max, min);
    cout << "Maximum: " << max << endl;
    cout << "Minimum: " << min << endl;
    return 0;
}

说明

  • 初始化 maxmin 为数组的第一个元素。
  • 遍历数组,逐个比较每个元素,更新 maxmin

方法二:使用标准库函数 std::min_elementstd::max_element

思路:使用 <algorithm> 头文件中的 std::min_elementstd::max_element 函数来查找数组中的最小值和最大值。

代码示例

#include <iostream>
#include <algorithm>
using namespace std;

void findMaxMin(int arr[], int size, int& max, int& min) {
    max = *max_element(arr, arr + size);
    min = *min_element(arr, arr + size);
}

int main() {
    int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    int max, min;
    findMaxMin(arr, size, max, min);
    cout << "Maximum: " << max << endl;
    cout << "Minimum: " << min << endl;
    return 0;
}

说明

  • std::max_elementstd::min_element 返回指向最大值和最小值的指针。
  • 使用解引用操作符 * 获取最大值和最小值。

方法三:使用 STL 容器和算法

思路:使用 STL 容器(如 std::vector)和算法(如 std::min_elementstd::max_element)来查找最大值和最小值。

代码示例

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void findMaxMin(const vector<int>& vec, int& max, int& min) {
    max = *max_element(vec.begin(), vec.end());
    min = *min_element(vec.begin(), vec.end());
}

int main() {
    vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    int max, min;
    findMaxMin(vec, max, min);
    cout << "Maximum: " << max << endl;
    cout << "Minimum: " << min << endl;
    return 0;
}

说明

  • 使用 std::vector 容器存储数组元素,更灵活。
  • 使用 std::max_elementstd::min_element 查找最大值和最小值。

方法四:使用递归

思路:通过递归函数逐个比较数组中的元素,更新最大值和最小值。

代码示例

#include <iostream>
using namespace std;

void findMaxMinRec(int arr[], int size, int& max, int& min, int index = 0) {
    if (index == size) {
        return;
    }
    if (arr[index] > max) {
        max = arr[index];
    }
    if (arr[index] < min) {
        min = arr[index];
    }
    findMaxMinRec(arr, size, max, min, index + 1);
}

int main() {
    int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    int max = arr[0], min = arr[0];
    findMaxMinRec(arr, size, max, min);
    cout << "Maximum: " << max << endl;
    cout << "Minimum: " << min << endl;
    return 0;
}

说明

  • 递归函数 findMaxMinRec 逐个比较数组中的元素,更新 maxmin
  • 递归终止条件是 index == size

方法五:使用分治法

思路:将数组分成两部分,分别查找每部分的最大值和最小值,然后比较两部分的结果,得到整个数组的最大值和最小值。

代码示例

#include <iostream>
using namespace std;

void findMaxMinDivide(int arr[], int low, int high, int& max, int& min) {
    if (low == high) {
        max = arr[low];
        min = arr[low];
        return;
    }
    if (high == low + 1) {
        if (arr[low] > arr[high]) {
            max = arr[low];
            min = arr[high];
        } else {
            max = arr[high];
            min = arr[low];
        }
        return;
    }
    int mid = (low + high) / 2;
    int max1, min1, max2, min2;
    findMaxMinDivide(arr, low, mid, max1, min1);
    findMaxMinDivide(arr, mid + 1, high, max2, min2);
    max = max1 > max2 ? max1 : max2;
    min = min1 < min2 ? min1 : min2;
}

int main() {
    int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    int max, min;
    findMaxMinDivide(arr, 0, size - 1, max, min);
    cout << "Maximum: " << max << endl;
    cout << "Minimum: " << min << endl;
    return 0;
}

说明

  • 递归地将数组分成两部分,分别查找每部分的最大值和最小值。
  • 比较两部分的结果,得到整个数组的最大值和最小值。

方法六:使用 Lambda 表达式和 std::for_each

思路:使用 C++11 的 Lambda 表达式结合 std::for_each 来查找最大值和最小值。

代码示例

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void findMaxMin(const vector<int>& vec, int& max, int& min) {
    max = vec[0];
    min = vec[0];
    for_each(vec.begin(), vec.end(), [&](int value) {
        if (value > max) max = value;
        if (value < min) min = value;
    });
}

int main() {
    vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    int max, min;
    findMaxMin(vec, max, min);
    cout << "Maximum: " << max << endl;
    cout << "Minimum: " << min << endl;
    return 0;
}

说明

  • 使用 Lambda 表达式简化了遍历和比较操作。
  • 结合 std::for_each 遍历容器元素。

这些方法各有优缺点,可以根据具体需求和场景选择合适的方法。

更多推荐