我尝试过以下方法来寻找第二大的&最小的数字,它的工作原理:
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);
}
}
现在我想找到第四个最大和最低的。在这种情况下,我可能需要使用4个循环。但我想以更短,更聪明的方式做到这一点。有人可以帮忙吗?
答案 0 :(得分:3)
这里有一些解决方案:
如果您不想对整个输入进行排序,可以放置一个您保持排序的临时集合(或使用已经排序的集合)。
例如,如果输入为“1,2,3,4,5,6,7,8,9,... 1000”,并且您希望获得第m个最大数字,则创建一个大小为m的临时集合,以及你经过的每个数字,你决定它是否应该在临时数组中。你应该始终对临时集合进行排序(或者只使用一个已经排序的集合),并在其中放入一个新项目,同时删除最小的项目,以防它的大小超过m。
就内存而言,使用小尺寸的集合项(m)并且不修改输入数组。
就操作数量(复杂性)而言,你得到的排序与排序数组相同 - O(nlogn),因为对于放入临时数组的每个项目,集合需要放置它的位置,并且采用logn(例如使用二进制搜索)。
顺便说一句,这个解决方案与获取最大/最小数字大致相同,只是你不需要对临时集合中的项目进行排序,因为它的大小为1。如果您不关心内存,但只是不想更改输入,则可以复制数组并对其进行排序......
有一种更好的算法可以在线性时间内工作,其工作方式类似于获得中位数的方法(链接here)。 here's一个更好地展示它的链接。
答案 1 :(得分:2)
您可以使用泛型方法。使用Arrays.sort(array);
对数组进行排序,然后您可以使用索引访问它。
答案 2 :(得分:2)
我认为最简单的方法是订购数组(是Log(n))。
如果你不想改变原始数组,你可以先进行克隆(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)]);
}
答案 3 :(得分:2)
对一般数组进行排序是O(nlogn),然后您可以按索引选择元素。
您还可以使用具有O(n)最坏情况时间复杂度的Select algorithm。算法得到一个数组和一些k,并返回第k个大元素。我相信你可以找到它的实现。
答案 4 :(得分:1)
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]);
}
}
答案 5 :(得分:1)
为了找到未排序数组的第i个元素,有一个非常简单的基于快速排序(quickselect)的随机算法,采用O(n)平均时间,以及一个非常复杂的非随机算法,采用O(n)最坏情况时间。
您需要的一切都在these powerpoint slides。只是为了提取O(n)最坏情况算法的基本算法:
选择(A,N,I): 将输入分为大小为5的⌈n/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)
Cormen等人的“算法导论”一书中也详细介绍了
对于最小元素,您只需检查每个元素,并且将花费O(n)时间。