首页 > 其他分享 >【分治查找数组的最大次大元素】

【分治查找数组的最大次大元素】

时间:2023-12-18 21:32:31浏览次数:29  
标签:arr 元素 次大 max 分治 element 查找 result 数组

分治算法介绍

分治算法是一种将问题分解成更小子问题,解决子问题,然后将它们的结果合并以解决原始问题的方法。对于查找数组的最大和次大元素,我们可以将数组分成两部分,然后分别查找每个子数组的最大和次大元素,最后将这些结果合并以得到原始数组的最大和次大元素。

算法步骤

  1. 如果数组只有一个元素,那么它既是最大元素又是次大元素,直接返回。

  2. 如果数组有多个元素,将数组分成两个子数组:左子数组和右子数组。

  3. 递归地在左子数组中查找最大和次大元素,并在右子数组中查找最大和次大元素。

  4. 将左子数组的最大和次大元素与右子数组的最大和次大元素进行比较,以找到原始数组的最大和次大元素。

示例代码

#include <iostream>
#include <vector>

using namespace std;

// 定义一个结构体来表示最大和次大元素对
struct MaxAndSecondMax {
    int max_element;
    int second_max_element;
};

// 分治函数,用于查找数组的最大和次大元素
MaxAndSecondMax findMaxAndSecondMax(const vector<int>& arr, int start, int end) {
    MaxAndSecondMax result;
    
    // 如果数组只有一个元素,那么它是最大元素,次大元素为空
    if (start == end) {
        result.max_element = arr[start];
        result.second_max_element = INT_MIN; // 初始次大元素为负无穷大
    }
    // 如果数组有两个元素,比较它们并返回
    else if (start + 1 == end) {
        if (arr[start] > arr[end]) {
            result.max_element = arr[start];
            result.second_max_element = arr[end];
        } else {
            result.max_element = arr[end];
            result.second_max_element = arr[start];
        }
    }
    // 如果数组有多个元素,分成左右两部分并递归查找最大和次大元素
    else {
        int mid = (start + end) / 2;
        MaxAndSecondMax left = findMaxAndSecondMax(arr, start, mid);
        MaxAndSecondMax right = findMaxAndSecondMax(arr, mid + 1, end);
        
        // 合并左右子问题的结果
        if (left.max_element > right.max_element) {
            result.max_element = left.max_element;
            result.second_max_element = max(left.second_max_element, right.max_element);
        } else {
            result.max_element = right.max_element;
            result.second_max_element = max(right.second_max_element, left.max_element);
        }
    }
    
    return result;
}

int main() {
    vector<int> arr = {3, 1, 5, 2, 7, 4};
    
    MaxAndSecondMax result = findMaxAndSecondMax(arr, 0, arr.size() - 1);
    
    cout << "最大元素: " << result.max_element << endl;
    cout << "次大元素: " << result.second_max_element << endl;
    
    return 0;
}

标签:arr,元素,次大,max,分治,element,查找,result,数组
From: https://blog.51cto.com/u_16202095/8878030

相关文章

  • 自动化查找并记录含图片文件夹的Python脚本
    功能介绍此Python脚本用于遍历指定的父目录,自动识别并记录所有包含图片文件(如PNG、JPG、GIF等格式)的子文件夹。脚本运行后,将在父目录下生成一个名为“文件夹名统计”的Excel表格,其中列出了所有含有图片的文件夹名称。这对于整理大量分散在不同子文件夹中的图片文件特别有用,尤其是......
  • Arrays工具类二分查找方法binarySearch方法详解​
    Arrays工具类二分查找方法binarySearch方法详解基础知识该方法的一般形式是publicstatic<T>intbinarySearch(T[]a,Tkey),对于基本类型,都有相应的重载方法,如针对int类型有binarySearch(int[]a,intkey)等。该方法的原理是使用二分查找算法在指定的数组中搜索指定的值。在调......
  • 二分查找细节分析
    二分查找细节分析本篇仅分析二分查找的细节问题,在阅读前请确保已经对“二分查找”概念与步骤有初步了解。二分查找的三个常用搜索区间搜索区间终止条件左右指针初始赋值左右指针赋值循环条件左闭右闭[l,r]相错终止l=0r=nums.length-1l=mid+1r=mid-1l<=r......
  • [LeetCode] LeetCode373. 查找和最小的K对数字
    题目描述思路:大顶堆+翻转注意:该题有问题,代码可以通过测试用例。方法一:classSolution{publicList<List<Integer>>kSmallestPairs(int[]nums1,int[]nums2,intk){PriorityQueue<Node>heap=newPriorityQueue<>((e1,e2)->e2.sum-e1.sum);......
  • linux查找文件
    linux查找文件常用的有find和whereis两种方式.find适用于复杂的查询,指定目录和文件名,通常可以找到你想要的文件.不要指定从根目录开始找,与其这样不如先推测一下这个文件可能在什么地方.whereis通常用来定位二进制文件,帮助文件,源码文件,默认情况下是在包管理......
  • CDQ分治
    CDQ分治一般珂以替代一些较复杂的高级数据结构,能用来处理偏序问题、优化dp转移等。大概思路就是分治处理点对的关系,分成三类点:\(\mathbf{\small{1}}\lei<j\lemid\)、\(\mathbf{\small{1}}\lei\lemid<j\len\)、\(mid<i<j\len\),然后用额外的\(O(logn)\)的时间去计算第二类......
  • 旋转数组 二分查找变种
    题目搜索旋转排序数组整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,......
  • 线性探测法的查找函数 整型关键字的散列映射
    一、 实验目的掌握哈希表二、  实验内容实验题目线性探测法的查找函数整型关键字的散列映射  三、   设计文档 1.   2.   四、   源程序  1. PositionFind(HashTableH,ElementTypeKey){    intflag=0;    Positionp......
  • 线性探测法的查找函数
    #include<stdio.h>#defineMAXTABLESIZE100000/*允许开辟的最大散列表长度*/typedefintElementType;/*关键词类型用整型*/typedefintIndex;/*散列地址类型*/typedefIndexPosition;/*数据所在位置与散列地址是同一类型*//*散列单元状态类......
  • 归并分治
    归并排序是计算机之父"冯·诺依曼"发明的,但这其中隐藏了一种归并分治的思想。这种思想在一些题目中会帮助我们解决很多问题。原理对于一个大问题的答案,如果等于左边子问题的答案+右边子问题的答案+跨越左右问题的答案。在计算跨越左右问题的答案时,左右两边是有序的是否会......