算法 || 分治法【查找最大元素和次大元素)】 #01

这篇具有很好参考价值的文章主要介绍了算法 || 分治法【查找最大元素和次大元素)】 #01。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分治法求解【查找最大元素和次大元素】

【问题描述】

对于给定的含有n元素的无序序列,求这个序列中最大和次大的两个不同的元素。例如:(2, 5, 1, 4, 6, 3),最大元素为6,次大元素为5。
【在无序数组a[low…high]中找到第一大和第二大的数。两数不同。】

【算法分析】

采用折半的方式,采用分治法求解。

分解:

情况1,如果数组a[low…high]只有一个数据,那么最大的数max1为a[low]。
情况2,如果数组a[low…high]有两个数据,那么比较两个数的大小,max1=max(low,high),max2=min(low,high)。
情况3,如果数组a[low…high]有3个及以上数据,那么采用自顶向下的二路归并思路,设置一个 mid=(low+high)/2 将数组a[low…high]一分为二,递归地对两个子序列a[low…mid]和a[mid+1…high]继续分解,结束条件为子序列长度为1。求出左区间最大元素和第二大元素 lmax1,lmax2和右区间最大元素和第二大元素 rmax1,rmax2。

合并

如果左区间最大元素大于右区间最大元素,那么max=lmax1,然后比较右区间最大元素和左区间第二大元素的大小。反之亦然。

【代码】

编译环境:VS2017
编程语言:C++文章来源地址https://www.toymoban.com/news/detail-405959.html

//ex1.查找最大和次大元素
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 25
#define INF 0x3f3f3f3f

void Solve(int a[], int low, int high, int &max1, int &max2)
{
	if (low == high)
	{
		max1 = a[low];
		max2 = -INF;
	}
	else if (low == high - 1)
	{
		max1 = max(a[low], a[high]);
		max2 = min(a[low], a[high]);
	}
	else
	{
		int mid = (low + high) / 2;
		int lmax1, lmax2;
		Solve(a, low, mid, lmax1, lmax2);
		int rmax1, rmax2;
		Solve(a, mid + 1, high, rmax1, rmax2);
		if (lmax1 > rmax1)
		{
			max1 = lmax1;
			max2 = max(lmax2, rmax1);
		}
		else
		{
			max1 = rmax1;
			max2 = max(lmax1, rmax2);
		}
	}
}

int main()
{
	int a[MAXN];
	int n;
	int max1 = 0, max2 = 0;
	cout << "请输入数组的长度:";
	cin >> n;
	cout << "请依次输入数据:";
	for (int i = 0; i <= n; i++)
		cin >> a[i];
	Solve(a, 0, n, max1, max2);
	cout << "第一大和第二大的数据分别为:" << max1 << " ," << max2 << endl;
	system("pause");
	return 0;
}

到了这里,关于算法 || 分治法【查找最大元素和次大元素)】 #01的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 最大子段和——用蛮力算法,分治策略,动态规划算法三种求法(C语言)

    目录 一、题目 二、算法求解 1、蛮力算法 伪代码  算法分析 程序 2、分治策略 伪代码 算法分析 程序 3、动态规划算法 伪代码 算法分析 程序 设A=a1,a2,...,an是n个整数的序列,称ai,....,aj为该序列的连续子序列,其中1=i=j=n,子序列的元素之和称为A的子段和: 例如,A=-2,11,-4,1

    2024年01月24日
    浏览(55)
  • Verilog 编程——筛选最大值与次大值

    海康今年的实习笔试题目中有一道编程题目,就是关于筛选输入数据中的最大值与次大值。在这里做一个及时的记录。 串行输入一个数据序列,要求在对这个序列仅进行1次遍历的情况下,输出最大的两个数。完善如下代码: 刚拿到这个题目,我只想到的是如何得到最大值,

    2024年02月14日
    浏览(64)
  • 在矩阵中查找最大值的元素 以及其所在的行号、列号(C语言)

    描述: 在一个5×6矩阵b中查找最大值的元素以及其所在的行号和列号。 输入: 输入5行,每行输入6个整数,整数之间用空格隔开。 输出: 在第一行中按格式“max=××”输出一个整数××,即矩阵b的最大值;在第二行中按格式“row=××”输出一个整数××,即最大值所在的行号;

    2024年02月12日
    浏览(45)
  • day1-数组part01| 704. 二分查找、27. 移除元素

    数组是存放在连续内存空间上的相同类型数据的集合。 数组下标从0开始 数组内存空间的地址是连续的 1、vector是顺序容器,其利用连续的内存空间来存储元素,但是其 内存空间大小是能够改变的 。 2、array是顺序容器,其也是利用连续的内存空间来存储元素,但它的 内存空

    2024年02月05日
    浏览(47)
  • 算法-二分查找、移除元素

    伪装成一个老手! 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 来源:力扣二分查找 1. Q1: 为

    2024年02月10日
    浏览(49)
  • 【算法】减治法详解

    分治法是将一个大问题划分为若干个子问题,分别求解后将子问题的解进行合并得到原问题的解。减治法同样是讲一个大问题划分为若干个小的子问题,但是这些子问题不需要分别求解,只需要求解其中一个子问题便可,因此也不需要对子问题进行合并,可以说,减治法是一

    2024年02月04日
    浏览(52)
  • 【教3妹学编程-算法题】最大频率元素计数

    2哥 : 3妹,最近有个电视剧《繁花》非常火🔥,你听说了吗? 3妹 :没有,最近一直在忙着找工作,哪有时间看电视啊 2哥 : 啊?大周末还不休息一下啊,这么辛苦。 3妹 :当然了,工作第一,娱乐第二!不过我听说这部剧被央视评为“孤品”, 以后有时间了一定要追一追。

    2024年01月20日
    浏览(36)
  • 算法刷题Day1 二分查找+移除元素

    代码随想录-数组-1.数组理论基础 数组是存放在 连续内存空间 上的 相同类型 数据的 集合 优点:常数时间复杂度访问元素 缺点: 在删除或者增添元素的时候,就难免要移动其他元素的地址 ,时间复杂度为O(n) 代码随想录-数组-2.二分查找 前提条件 二分查找前提条件: 数组

    2024年02月10日
    浏览(54)
  • 算法通关村——位运算在查找重复元素中的妙用

    给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。 如果不要求使用4KB,最简单就是使用N长的数组然后将元素都存入数组,再打印,但是题目规定了4KB,很显然这种做法就不大行了

    2024年02月10日
    浏览(47)
  • [Kadane算法,前缀和思想]元素和最大的子矩阵

    题目描述 输入一个n级方阵,请找到此矩阵的一个子矩阵,此子矩阵的各个元素的和是所有子矩阵中最大的,输出这个子矩阵及这个最大的和。 关于输入 首先输入方阵的级数n, 然后输入方阵中各个元素。 关于输出 输出子矩阵, 最后一行输出这个子矩阵的元素的和。 例子输

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包