2013-04-29 86 views
0

於是找到中間的元素,我有數組是這樣的:在數排序陣列

a[1] = 2 
a[4] = 3 
a[8] = 1 

代表這個序列1 1 4 4 4 8

我需要之前找到中間的元素,或元素(奇數和偶數); 在這個例子中它的4.

我該怎麼做這個快?

我的代碼是非常緩慢:2(找到MID)

static int B(int[] array, int size) {  
    int c = 0; 
    for (int i = 0; i < array.length; i++) { 
     for (int j = 0; j < array[i]; j++) { 
      c++; 
      if (c == size/2) { 
       return i;  
      } 
     } 
    } 
} 
+0

爲什麼在四捨五入之後不能訪問(a.length/2)值? – RelevantUsername 2013-04-29 21:32:17

+0

@BaileyS您的意思是?我將使用這個數組,但我需要找到中間元素 – JohnDow 2013-04-29 21:34:56

+0

@ VladislavIl'ushin向我們展示更清晰的東西。可能是您嘗試的一些示例或代碼。 – Smit 2013-04-29 21:35:13

回答

5
  1. 導線原陣列,並添加所有值

    a[1] = 2 
    a[4] = 3 
    a[8] = 1 
    sum = 6 
    
  2. 鴻溝和

    mid = 6/2 = 3 
    
  3. 遍歷原創a rray和總和

    check if ans <= 0 
    if true print index 
    else continue to next 
    
+0

簡單的方法,至多需要O(N)。保持這個速度。 – 2013-04-29 22:11:00

0

減去值對於效率更低的方式來做到這一點,通過運行一個通,並保持更新:)

使用Javascript(因爲我是Java的挑戰):

var a=[] 

a[1] = 2 
a[4] = 3 
a[8] = 1 
a[9] = 2 
a[10] = 3 
a[11] = 1 
//1 1 4 4 4 8 9 9 10 10 10 11 

function middle (arr){ 
    var stack = [], 
     total = 0, 
     tmp, 
     tmpChange, 
     middle = 0, 
     change = 0, 
     middleElement 

    for (i in arr){ 
    stack.push([i, arr[i]]) 
    total += arr[i] 
    tmp = Math.ceil(total/2) 
    change = tmp - middle 
    middle = tmp 

    while (change){ 
     tmpChange = stack[0][1] - change 

     if (tmpChange >= 0) { 
     stack[0][1] = tmpChange 
     change = 0 
     } 
     else { 
     change -= stack[0][1] 
     stack.splice(0,1) 
     } 
    } 

    middleElement = stack[0][0] 
    } 

    return middleElement 
} 

console.log(middle(a))