C++求最大与最小值

该篇C++代码示例展示了如何在没有使用内置max和min函数的情况下,通过初始化maxn和minn变量,遍历数组并逐个元素比较来找到数组中的最大值和最小值。程序包括输入数组长度和元素,然后更新maxn和minn的过程,最后输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C++中,求最大与最小值是一个常用的算法。

虽然有些算法库里有max和min函数,但是我们要还是要学会如何去编写。

首先,我们要了解一下思路。求最大与最小值的思路相似,就像打擂台赛一样,if(a[i]>maxn),那么就将maxn值设为a[i]。(minn相似,把>改成<,maxn改成minn即可)

程序如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,a[100005],minn=100000,maxn=0;//为避免与max和min函数冲突,将变量名改为maxn和minn,将minn初始值设为最大,将maxn初始值设为最小,以保证他们一定被“打下去”
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        if(maxn<a[i]){
            maxn=a[i];
        }

        if(minn>a[i]){
            minn=a[i];
        }
    }
    cout<<maxn<<" "<<minn;
    return 0;
}

练习:

章节练习--最大值 ( 课程8) (51goc.com)

章节练习--求最小值 (课程8) (51goc.com)

<think>嗯,用户想了解如何在C++最大值最小值。首先,我需要确定他们指的是数组中的最大值最小值,还是其他数据结构,比如向量或者列表。通常来说,这类问题最常见的情况是处理数组。所以,我应该先考虑数组的情况。 接下来,我应该回忆一下C++中的基本方法。对于数组,最直接的方法就是遍历所有元素,比较当前元素和当前记录的最大值最小值。这时候可能需要初始化最大值最小值,通常的做法是将第一个元素作为初始值,然后从第二个元素开始遍历。这样可以避免初始值可能带来的问题,比如用0作为初始最大值,而数组元素都是负数的情况。 然后,我需要考虑是否有现成的库函数可以使用。比如,标准库中的algorithm头文件里有max_element和min_element函数,这两个函数可以返回指向最大或最小元素的迭代器。使用这些函数可以简化代码,特别是对于容器如vector来说更方便。不过如果是普通的数组,这两个函数同样适用,因为指针可以当作迭代器使用。 不过用户可能想知道两种方法:手动遍历和使用库函数。因此,我应该分别介绍这两种方法,并给出示例代码。这样用户可以根据自己的需选择合适的方式。 然后,可能需要注意一些边界情况,比如空数组的情况,这时候程序可能会崩溃或者出现未定义行为。所以在实际应用中,应该先检查数组是否为空,但示例代码中可能为了简单起见省略了这部分处理,但需要提醒用户注意这一点。 另外,对于同时最大值最小值的情况,如果分开遍历两次,时间复杂度是O(2n),而如果同时在一个循环中处理,时间复杂度是O(n),虽然两者都是线性时间,但后者更高效。所以可能可以优化一下,手动遍历时同时更新最大值最小值,这样只需要遍历一次数组。 此外,对于C++11或更高版本,可能还有其他方法,比如使用STL的算法库中的minmax_element函数,可以一次性找到最大最小值,这可能会更高效。这也是一个值得提及的点,特别是当数组很大时,减少遍历次数是有好处的。 总结下来,回答的结构应该包括: 1. 手动遍历法,逐个比较,同时处理最大值最小值。 2. 使用algorithm库中的max_element和min_element函数。 3. 使用minmax_element函数一次获取两个极值。 4. 提醒边界条件,比如空数组的处理。 现在需要把这些思路整理成中文,用清晰简洁的步骤和示例代码展示出来。同时要注意代码的正确性,比如指针的使用,迭代器的转换,以及输出时的解引用操作是否正确。 最后,检查是否有遗漏的情况,比如用户可能处理的是其他类型的容器,比如vector,是否需要特别说明?可能需要,但问题中用户提到的是C++,所以可以通用地说明数组和vector的处理方法,因为两者在C++中处理方式类似,只是vector需要使用begin()和end()迭代器。 可能还需要比较不同方法的优缺点,比如手动遍历可控性高,适合特殊需,而库函数简洁,减少出错可能。而minmax_element效率更高,但需要C++11支持。 现在把这些整理成一个连贯的回答,分步骤解释,并附上示例代码。</think>在 C++最大值最小值可以通过手动遍历或使用标准库函数实现。以下是两种常见场景的示例: --- ### **1. 手动遍历法(适合基础理解)** 通过循环遍历数组,逐个比较元素,记录当前的最大值最小值: ```cpp #include <iostream> using namespace std; int main() { int arr[] = {5, 2, 9, 1, 5, 6}; int n = sizeof(arr) / sizeof(arr[0]); if (n == 0) { cout << "数组为空!" << endl; return 0; } int max_val = arr[0]; int min_val = arr[0]; // 遍历数组,同时更新最大值最小值 for (int i = 1; i < n; i++) { if (arr[i] > max_val) { max_val = arr[i]; } if (arr[i] < min_val) { min_val = arr[i]; } } cout << "最大值: " << max_val << endl; cout << "最小值: " << min_val << endl; return 0; } ``` --- ### **2. 使用标准库函数(简洁高效)** C++ 的 `<algorithm>` 头文件提供了 `max_element` 和 `min_element` 函数,可直接获取极值: #### **示例代码(数组或容器通用)** ```cpp #include <iostream> #include <algorithm> // 包含必要头文件 #include <vector> // 如果使用 vector using namespace std; int main() { // 数组示例 int arr[] = {5, 2, 9, 1, 5, 6}; int n = sizeof(arr) / sizeof(arr[0]); // 计算最大值最小值 auto max_ptr = max_element(arr, arr + n); auto min_ptr = min_element(arr, arr + n); cout << "数组最大值: " << *max_ptr << endl; cout << "数组最小值: " << *min_ptr << endl; // vector 示例 vector<int> vec = {5, 2, 9, 1, 5, 6}; auto vec_max = max_element(vec.begin(), vec.end()); auto vec_min = min_element(vec.begin(), vec.end()); cout << "vector最大值: " << *vec_max << endl; cout << "vector最小值: " << *vec_min << endl; return 0; } ``` --- ### **3. 一次性获取最大最小值C++11+)** 使用 `minmax_element` 函数可以一次遍历同时获取两个极值,效率更高: ```cpp #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { vector<int> data = {5, 2, 9, 1, 5, 6}; // 返回一对迭代器,first 是最小值,second 是最大值 auto result = minmax_element(data.begin(), data.end()); cout << "最小值: " << *result.first << endl; cout << "最大值: " << *result.second << endl; return 0; } ``` --- ### **注意事项** 1. **空容器处理**:使用库函数前需确保容器非空,否则可能引发未定义行为。 2. **性能优化**:手动遍历法在一次循环中同时处理最大最小值,时间复杂度为 O(n),库函数效率相同。 3. **适用范围**:以上方法适用于数组、`vector`、`list` 等线性容器。 根据需选择合适的方法:手动遍历可控性更强,适合特殊逻辑;库函数简洁高效,适合通用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值