使用遍历方法和分治法求两个数组的值

简介: 看似简单的姐数组中的最大值实际上体现了不同的思路本文将以比较数组大小为背景,分别展示普通算法和分治法,通过对比来简述分治法。问题描述给定一个整数数组,编写一个算法来找到数组中的最大值和最小值。

看似简单的姐数组中的最大值实际上体现了不同的思路本文将以比较数组大小为背景,分别展示普通算法和分治法,通过对比来简述分治法。

问题描述

给定一个整数数组,编写一个算法来找到数组中的最大值和最小值。


解决方法

方法一:遍历数组

最简单的方法是遍历数组并比较每个元素,找到最大值和最小值。



#include <iostream>

#include <vector>

using namespace std;


void findMinMax(vector<int>& nums, int& minVal, int& maxVal) {

   if (nums.empty()) {

       return;  // 数组为空,直接返回

   }


   minVal = nums[0];  // 初始化最小值为第一个元素

   maxVal = nums[0];  // 初始化最大值为第一个元素


   for (int num : nums) {

       minVal = min(minVal, num);  // 更新最小值

       maxVal = max(maxVal, num);  // 更新最大值

   }

}


int main() {

   vector<int> nums = {3, 7, 1, 9, 4, 5, 8, 2};

   int minVal, maxVal;

   findMinMax(nums, minVal, maxVal);

   cout << "Min Value: " << minVal << endl;

   cout << "Max Value: " << maxVal << endl;

   return 0;

}

方法二:分治法

另一种更高效的方法是使用分治法。将数组分为两半,分别在左半部分和右半部分找到最大值和最小值,然后比较左右两部分的结果。

#include <iostream>

#include <vector>

using namespace std;


void findMinMaxRecursive(vector<int>& nums, int left, int right, int& minVal, int& maxVal) {

   if (left == right) {

       minVal = nums[left];

       maxVal = nums[left];

       return;

   }


   int mid = left + (right - left) / 2;

   int leftMin, leftMax, rightMin, rightMax;

   findMinMaxRecursive(nums, left, mid, leftMin, leftMax);

   findMinMaxRecursive(nums, mid + 1, right, rightMin, rightMax);


   minVal = min(leftMin, rightMin);

   maxVal = max(leftMax, rightMax);

}


void findMinMax(vector<int>& nums, int& minVal, int& maxVal) {

   if (nums.empty()) {

       return;  // 数组为空,直接返回

   }


   findMinMaxRecursive(nums, 0, nums.size() - 1, minVal, maxVal);

}


int main() {

   vector<int> nums = {3, 7, 1, 9, 4, 5, 8, 2};

   int minVal, maxVal;

   findMinMax(nums, minVal, maxVal);

   cout << "Min Value: " << minVal << endl;

   cout << "Max Value: " << maxVal << endl;

   return 0;

}

总结

本文介绍了两种寻找数组中最大值和最小值的算法:遍历数组和分治法。遍历数组是最简单的方法,但在数组较大时效率较低。分治法通过将数组分成多个子问题来提高效率。无论使用哪种方法,都可以在数组中轻松找到最大值和最小值。

目录
相关文章
|
12月前
|
编解码 前端开发 UED
HTML多媒体格式支持与优化
在HTML中,多媒体格式的支持与优化至关重要。使用`&lt;audio&gt;`、`&lt;video&gt;`和`&lt;img&gt;`标签可分别嵌入音频、视频和图像。支持的格式包括MP3、OGG、JPEG等。为优化体验,应压缩文件、采用响应式设计、使用懒加载,并考虑转码及CDN托管。此外,添加字幕和描述文件可提高辅助功能。遵循这些最佳实践,能显著提升多媒体内容的加载速度与用户满意度。
|
算法 前端开发 Java
从新手到专家:开发者的成长之路
软件开发充满挑战与机遇,从新手成长为专家是许多开发者的梦想。本文详细介绍了这一过程,包括基础知识学习与实践经验积累;持续技能提升与新技术探索;深入专研特定领域并分享知识;以及保持积极开放的心态面对挑战。成为专家需要时间与努力,但正确的路径与态度将助你一臂之力。
|
10月前
|
存储 机器学习/深度学习 人工智能
【AI系统】完全分片数据并行 FSDP
本文深入探讨了AI框架中针对权重数据、优化器数据和梯度数据的分布式并行实现,特别是在PyTorch框架下的具体方案。文章首先回顾了通用数据并行和分布式数据并行的概念,重点讨论了同步与异步数据并行的差异。接着,文章详细介绍了如何在PyTorch中实现弹性数据并行,特别是完全分片数据并行(FSDP)的机制,包括其如何通过分片模型状态和剩余状态来减少内存消耗,提高训练效率。此外,文章还探讨了混合精度训练、损失缩放和内存消耗估算等关键技术,为理解和实施高效的分布式训练提供了全面的指导。
351 9
【AI系统】完全分片数据并行 FSDP
|
存储 固态存储 安全
阿里云4核CPU云服务器价格参考,最新收费标准和活动价格
阿里云4核CPU云服务器多少钱?阿里云服务器核数是指虚拟出来的CPU处理器的核心数量,准确来讲应该是vCPU。CPU核心数的大小代表了云服务器的运算能力,CPU越高,云服务器的性能越好。阿里云服务器1核CPU就是一个超线程,2核CPU2个超线程,4核CPU4个超线程,这样云服务器可以同时处理多个任务,计算性能更强。如果网站流程较小,少量图片展示的企业网站,建议选择2核及以上CPU;如果网站流量较大,动态页面比较多,有视频等,建议选择4核、8核以上CPU。
阿里云4核CPU云服务器价格参考,最新收费标准和活动价格
|
10月前
|
机器学习/深度学习 人工智能 算法
【AI系统】LLVM 后端代码生成
本文介绍 LLVM 后端的代码生成过程,包括将优化后的 LLVM IR 转换为目标代码的关键步骤,如指令选择、寄存器分配、指令调度等,以及后端如何支持不同硬件平台的代码生成。
142 6
|
11月前
|
Python
Matplotlib 绘图标记
Matplotlib 绘图标记
158 2
|
Oracle 关系型数据库 MySQL
OceanBase有哪些功能?OceanBase有哪些功能?
OceanBase有哪些功能?【8月更文挑战第11天】
351 62
|
12月前
|
监控 供应链 数据可视化
深入探索研究TOGAF
【10月更文挑战第15天】
311 0
|
12月前
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
Vue3开关(Switch)
这是一个可高度定制的开关组件,支持设置选中与未选中时的内容、值、大小、加载状态、禁用状态及点击波纹颜色等属性。组件提供了多种尺寸选择,并允许自定义图标与样式,适用于多种场景下的开关功能实现。[在线预览](https://themusecatcher.github.io/vue-amazing-ui/guide/components/switch.html)展示了其丰富的配置选项和实际效果。
288 4
Vue3开关(Switch)