Java 寻找第四大;数组中的第四个最小数

Java 寻找第四大;数组中的第四个最小数,java,arrays,sorting,Java,Arrays,Sorting,我尝试了以下方法来查找第二大和第二小的数字,它是有效的: class Test { static void main()throws IOException { Scanner sc = new Scanner(System.in); System.out.println("Enter"); int a[] = {45,79,2,5,74,4,19,56,2,888}; int small= a[0]; int big=a[0]; int s

我尝试了以下方法来查找第二大和第二小的数字,它是有效的:

class Test

{

static void main()throws IOException

{
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter");
    int a[] = {45,79,2,5,74,4,19,56,2,888};
    int small= a[0];
    int big=a[0];
    int s=0,b=0;
    for(int i=0;i<10;i++)
    {
        if(small>a[i])
        {
            small=a[i];
        }
        if(big<a[i])
        {
            big=a[i];
        }
    }

    int small2=a[0],big2=a[0];

    for(int i=0;i<10;i++)
    {
        if(small2>a[i]&&a[i]!=small)
        {
            small2=a[i];
        }
        if(big2<a[i]&&a[i]!=big)
        {
            big2=a[i];
        }
    }
    System.out.println("second biggest = "+big2);
    System.out.println("second smallest = "+small2);
}
}
类测试
{
静态void main()引发IOException
{
扫描仪sc=新的扫描仪(System.in);
系统输出打印项次(“输入”);
INTA[]={45,79,2,5,74,4,19,56,2888};
int small=a[0];
int big=a[0];
int s=0,b=0;
对于(int i=0;ia[i])
{
小=a[i];
}

如果(大您可以使用通用方法。使用
数组对数组进行排序。排序(数组);
然后您可以使用索引访问它。

我认为最简单的方法是对数组进行排序(是Log(n))

public class FourthLargest {

    static int a[] = {45, 79, 2, 5, 74, 4, 19, 56, 2, 888};

    public static void main(String[] args) {
        Arrays.sort(a);
        System.out.println("The fourth smallest number = " + a[3]);
        System.out.println("The fourth largest number = " + a[a.length-4]);
    }
}
如果不想更改原始数组,可以先进行克隆(int b[]=Arrays.copyOf(a,a.length);)

如果您想要数组中的位置而不是值,请告诉我,我将找到另一个解决方案

告诉我这是否有帮助:

    public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter");
    int a[] = { 45, 79, 2, 5, 74, 4, 19, 56, 2, 888 };

    Arrays.sort(a);
    System.out.print("ordered array: ");
    for(int i:a){
        System.out.print(i+", ");
    }
    System.out.println();
    System.out.println("the 4th smallest : " + a[3]);
    System.out.println("the 4th biggest: " + a[(a.length - 4)]);

}

以下是一些解决方案:

  • 如果不希望对整个输入进行排序,可以放置一个保持排序的临时集合(或使用一个已始终排序的集合)

    例如,如果输入为“1,2,3,4,5,6,7,8,9,…1000”,并且您希望获得第m个最大的数字,您将创建一个大小为m的临时集合,每个数字都由您决定是否应该在临时数组中。您应该始终保持临时集合的排序(或者只使用一个已经排序的临时集合),然后放入一个新项目,如果其大小超过m,则移除最小的项目

    就内存而言,您使用了较小的集合项(m),并且不修改输入数组

    就操作数(复杂性)而言,您得到的结果与对数组进行排序的结果大致相同-O(nlogn),因为对于放入临时数组的每个项目,集合都需要知道将其放置在何处,这需要logn(例如使用二进制搜索)

    顺便说一句,这个解决方案与获取最大/最小的数字大致相同,只是您不需要对临时集合中的项目进行排序,因为它的大小为1

  • 如果您不关心内存,但不想更改输入,则可以复制数组并对其进行排序

  • 有一个更好的算法可以在线性时间内工作,工作原理类似于你如何得到一个中位数(链接)。一个链接可以更好地显示它


  • 一般数组的排序是O(nlogn),然后您可以通过索引选择元素


    您也可以使用具有O(n)最坏情况时间复杂度的。该算法获得一个数组和一些k,并返回第k个大元素。我相信您可以找到它的实现。

    为了找到未排序数组的第I个元素,有一个非常简单的随机算法,它基于快速排序(quickselect),取O(n)平均时间,以及一个相当复杂的非随机算法,需要O(n)个最坏情况时间

    您所需要的一切都在其中。只需提取O(n)最坏情况算法的基本算法:

    选择(A、n、i): 将输入分成⌈不适用⌉ 5人一组

    /* Partition on median-of-medians */
    medians = array of each group’s median.
    pivot = Select(medians, ⌈n/5⌉, ⌈n/10⌉)
    Left Array L and Right Array G = partition(A, pivot)
    
    /* Find ith element in L, pivot, or G */
    k = |L| + 1
    If i = k, return pivot
    If i < k, return Select(L, k-1, i)
    If i > k, return Select(G, n-k, i-k)
    
    /*中间带上的分区*/
    中位数=每组中位数的数组。
    枢轴=选择(中间点,⌈不适用⌉, ⌈n/10⌉)
    左数组L和右数组G=分区(A,轴)
    /*在L、pivot或G中查找第i个元素*/
    k=| L |+1
    如果i=k,则返回枢轴
    如果ik,返回选择(G,n-k,i-k)
    
    Cormen等人的《算法导论》一书中也非常详细地介绍了这一点


    对于最小的元素,您可以简单地检查每个元素,并取O(n)时间。

    我知道我可以排序,但我不想。这很重要big@Shubham有一些限制,你不能对数组进行排序??我认为这是一种面试问题,主要集中在逻辑构建上。这是我的通行时间,以提高我的技能和了解更多保持一个最小的4个数组(初始化为最大正数)和一个4个最大的数组(初始化为最大负数)。同时保留一个最大的“小”值和另一个最小的“大”值,同样初始化。扫描,比较最大的小和最小的大。当你得到一个“命中”时,将数字插入适当的列表中,踢出“失败者”。如果需要算法,则不要使用“java”标记,如果不使用数组。sort()…在O(n)时间内用元素构建最小堆。也可以使用二进制计数器数据结构。好的,这些链接如何: