查找最大和次大元素(JAVA版)(分治法)

问题描述:对于给定的含有n个元素的无序序列,求这个序列中最大和次大的两个不同元素。

问题求解分析(分治法):先给出无序序列数组a[low...high]。第一种情况为当数组中只有一个元素时,此时只存在一个最大值即为本身,次大值为负无穷,在这里我设置为-999999,第二种情况为数组中只有两个元素,此时最大值和次大值很显然将两个元素比较即可。第三种情况为数组中的元素大于两个,此时用分治法,将数组中元素砍为两半,像我们将香肠折半,注意的是此时中间的点归为前半部分,接着我们对前半部分再次进行判断三种情况,再对后半部分做同样的操作,因为我们每次判断返回的都是当前判断的一部分的最大值和次大值,因此折半后两边都有最大值和次大值,再将两边的四个值比较找出最大值和次大值。

代码如下:

import java.util.*;
public class Main {
    static int a[];//存放数据的数组
    static int inf=-999999;//自定义最小值
    public static void main(String args[])
    {
        a=new int[5];
        a[0]=4;a[1]=3;a[2]=5;a[3]=9;a[4]=1;//测试数据,可修改为键盘输入
        max m=solve(0,4);//调用solve方法求出最大值和次大值
        System.out.println(m.max1+"  "+m.max2);//输出
    }
    static class max//自定义类(存放最大和次大值)
    {
        int max1;//最大值
        int max2;//次大值
        max(){};//构造函数
    }
    static max solve(int low,int high)//low和high为数组中的起始下标和终止下标
    {
        max mm=new max();//声明,因为每次寻找返回的最大值和次大值都要更新
        if(low==high)//如果只有一个元素
        {
            mm.max1=a[low];//最大值为本身
            mm.max2=inf;//次大值为inf
        }
        else if(low==high-1)//如果只有两个元素
        {
            mm.max1=Math.max(a[low], a[high]);//最大值为两个元素中的最大值
            mm.max2=Math.min(a[low], a[high]);//最小值为两个元素中的最小值
        }
        else//大于两个元素
        {
            int mid=(low+high)/2;//设中间值为mid
            max m1=solve(low,mid);//m1为前半部分的最大值和次大值(包括a[mid])
            max m2=solve(mid+1,high);//m2为后半部分的最大值和次大值
            if(m1.max1>m2.max1)//如果前半部分最大值大于后半部分最大值
            {
                mm.max1=m1.max1;//更新最大值为前半部分最大值
                mm.max2=Math.max(m1.max2,m2.max1);//次大值为前半部分次大值与后半部分最大值的最大值
            }
            else
            {
                mm.max1=m2.max1;//更新最大值为后半部分最大值
                mm.max2=Math.max(m2.max2, m1.max1);//次大值为后半部分次大值与前半部分最大值的最大值
            }
        }
        return mm;//返回
    }

}

注意:每次调用solve方法时,都要初始化mm,因为这样才能使low和high更新时,mm中每次存放的为low~high的最大值和次大值;

空吧哇~

原文地址:https://www.cnblogs.com/rousong/p/11294365.html

时间: 2024-10-02 22:42:15

查找最大和次大元素(JAVA版)(分治法)的相关文章

无序数组同时查找最大和最小的元素

在无序数组中查找最大或者最小的元素都需要进行n次比较,但是同时查找最大和最小的元素却可以在3n/2次比较内实现. 问题:给定一个长度为n的无序序列,同时查找出这个序列中的最大和最小值. 算法设计:如果只是在无序序列中查找最大或最小值,至少需要n-1次比较,但是同时查找出最大值和最小值却不需要2(n-1)次比较,而只需要3n/2次比较.其策略是:同时保存当前得到的最大值和最小值,之后依次从无序序列中取出两个数并进行比较,其中较小的一个与当前的最小值比较,较大的一个于当前的最大值比较,然后更新当前的

大整数乘法(分治法)

题目:输入两个大整数,用数组保存每一位数,然后用分治法计算: 思路:输入X Y,X高位用A数组保存,低位用B数组保存,Y高位用C数组保存,低位用D数组保存,则:X=A*10^(n/2)+B  Y=C*10^(n/2)+D 分治方法:X*Y=A*C*10^n+((A-B)*(D-C)+A*C+B*D)*10^(n/2)+B*D; 代码如下: #include <iostream> #include <algorithm> #include <cstring> #inclu

求数组中第k大的数(分治法)

思想:快排 因为单趟排序是使选定的king值到其应该到的位置,所以每次判断这个king的正确位置是否是第K大数的位置即可 #include <iostream> using namespace std; //快排中的单趟排序 int PartSort(int* arr,int start,int end) { int first = start; int last = end; int tmp = arr[first]; int key = first; while (first < l

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

Mysql 查找表中的前n大元素

转载注明出处:http://www.cnblogs.com/liangyongrui/p/8622593.html Mysql 查找表中的前n大元素 用程序写很简单,利用堆维护一下就行了,但是用sql呢? 解法: 假设需要比较的字段是a,找出前n大的行,则答案为count(比a小的行) < n的行.(说起来有点绕..看个例子就懂了) 假设有这样的一个表 Id Name Salary 1 Joe 70000 2 Henry 80000 3 Sam 60000 4 Max 90000 5 Janet

Leetcode 703题数据流中的第K大元素(Kth Largest Element in a Stream)Java语言求解

题目链接 https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/ 题目内容 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素.你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素.每次调用 KthLargest.add,返回当前数据流中第K大的元素. 示例: int k = 3; int[] arr = [4,5,8

LeetCode--496--下一个更大元素I(java)

给定两个没有重复元素的数组 nums1和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素.如果不存在,对应位置输出-1. 示例 1: 输入: nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出: [-1,3,-1] 解释: 对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因

AKKA文档(java版)

目前我正在翻译AKKA官网文档.翻译:吴京润 译者注:本人正在翻译AKKA官网文档,本篇是文档第一章,欢迎有兴趣的同学加入一起翻译.更多内容请读这里:https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/lists/ded96c34f7ce4a6bb8b5473f596e1008/show/https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/todos/640e53d

经典排序算法(Java版)

经典排序算法(Java版)  转载 1.冒泡排序 Bubble Sort最简单的排序方法是冒泡排序方法.这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮.在冒泡排序算法中我们要对这个“气泡”序列处理若干遍.所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确.如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置.显然,处理一遍之后,“最轻”的元素就浮到了最高位置:处理二遍之后,“次轻”的元素就浮到了次高位