2016-01-28 85 views
-3

我想設計一個算法,給定n個元素的列表,找到3n/2比較中的最小值和最大值。如何做到這一點的任何提示?使用3n/2比較找出最大和最小元素?

+0

「太多可能的答案」?你可以列出多少個可能的答案?我想知道。如果你不能,請你收回你的-3票。 –

回答

4

作爲一個提示,想象一下所有陣列元素都是淘汰賽中的球員。將所有球員配對,讓「贏家」(更大的數字)晉級一場比賽,而「輸家」(較小的數字)則落入輸家的支架。您現在將有n/2個獲勝者考慮,最大值必須是其中的一個,並考慮n/2個失敗者,最小值必須是其中之一。在這樣做的過程中,你做了n/2次比較。你能用餘下的n個比較來找出一組的最小值和另一組的最大值?

+0

難道你不能在這個過程中找到最小和最大值? – ChiefTwoPencils

+2

@ChiefTwoPencils是的。我有點希望OP能做些工作來弄清楚如何。 :-) – templatetypedef

+0

Upvoted,但是根據n是偶數還是奇數,你必須小心計數。我認爲當n是偶數時可以得到3n/2 - 2的比較結果,當n是奇數的時候可以得到(3n-3)/ 2的比較結果。 –

0

@templatetypedef的提示是正確的:

public static void findMinimumAndMaximumOf(int[] numbers) { 
    assert numbers.length >= 2; 
    List<Integer> bigList = new ArrayList<>(numbers.length/2); 
    List<Integer> smallerList = new ArrayList<>(numbers.length/2); 
    int i = 1; 
    for (; i < numbers.length; i = i + 2) { 
     if (numbers[i] > numbers[i - 1]) { 
      bigList.add(numbers[i]); 
      smallerList.add(numbers[i - 1]); 
     } else { 
      bigList.add(numbers[i - 1]); 
      smallerList.add(numbers[i]); 
     } 
    } 
    if ((numbers.length & 1) == 1) { 
     if (numbers[numbers.length - 1] > numbers[numbers.length - 2]) { 
      bigList.add(numbers[numbers.length - 1]); 
     } else { 
      smallerList.add(numbers[numbers.length - 1]); 
     } 
    } 
    Iterator<Integer> iBig = bigList.iterator(); 
    int biggest = iBig.next(); 
    while (iBig.hasNext()) { 
     int current = iBig.next(); 
     if (current > biggest) { 
      biggest = current; 
     } 
    } 
    Iterator<Integer> iSmall = smallerList.iterator(); 
    int smallest = iSmall.next(); 
    while (iSmall.hasNext()) { 
     int current = iSmall.next(); 
     if (current < smallest) { 
      smallest = current; 
     } 
    } 
    System.out.println(String.format("Max:%d, Min:%d" ,biggest,smallest)); 
}