2016-01-13 135 views
-2

我想讓一個數組增加一個數組,如果i + 1中的一個元素少於或等於i中的元素,那麼多次添加一個int n到那個元素,直到它變得多於比在我的元素,所以繼續下去,直到整個過程所需的最後一個元素和打印動作。我正在使用for while while循環它工作得很好,但在某些情況下它需要太多時間。任何建議,以減少時間複雜度,如果它是possibe你能給我一些關於它的信息(順便說一句,我的新手)減少循環的時間複雜度

int move=0; 
for(int i=0;i<list.length-1;i++) 
{ 
    while(list[i+1]<=list[i]) 
    { 
    list[i+1]+=n; 
    move++; 
    } 
} 
+0

你考慮減法而不是while循環嗎? – matt

回答

0

你可以這樣做,在某些情況下沒有很多(可能是數百萬)的總和。

int move=0; 
for(int i=0;i<list.length-1;i++) 
{ 
    if (list[i+1]<=list[i]) { 
     int steps = (int)((list[i]-list[i+1])/n) + 1; 
     list[i+1] += steps*n; 
     move += steps; 
    } 
} 
1

在我看來,你應該這樣來做:

int move=0; 
for(int i=0;i<list.length-1;i++) 
{ 
    if(list[i+1]<=list[i]) 
    { 
    int toAdd = (int) Math.ceil((list[i]-list[i+1])/n); 
    list[i+1]+= n * toAdd; 
    move++; 
    } 
} 

請讓我知道它是否有效。

+0

給出此錯誤:不兼容的類型:可能有損從double轉換爲int – Geek

+0

是的,對不起,我忘記了if語句的第一行中的(int)。 – osanger

+0

而且你不會把'move'算作問題所在,每增加一個'n'都是一個舉動。你的代碼也是不正確的:在list [i] == list [i + 1]的情況下,'list [i + 1] + = n * toAdd'會添加0,如果阻止條件' list [i + 1] <= list [i])'仍然會返回true。 – dezhik