給出了一個由N個整數組成的非空零索引數組A.一對整數(P,Q),使得0≤P< Q < N被稱爲數組A的切片(注意該切片至少包含兩個元素)。切片(P,Q)的平均值是A [P] + A [P + 1] + ... + A [Q]除以切片長度的總和。準確地說,平均值等於(A [P] + A [P + 1] + ... + A [Q])/(Q - P + 1)。
例如,陣列A使得:最小平均兩個切片編碼
A[0] = 4
A[1] = 2
A[2] = 2
A[3] = 5
A[4] = 1
A[5] = 5
A[6] = 8
包含以下示例切片:
- 片(1,2),其平均爲(2 + 2)/ 2 = 2;
- 切片(3,4),其平均值爲(5 + 1)/ 2 = 3;
- 切片(1,4),其平均值爲(2 + 2 + 5 + 1)/ 4 = 2.5。
目標是找到平均最小片的起始位置。
寫功能:
class Solution { public int solution(int[] A); }
,鑑於非空零索引的數組A由N個整數的,返回具有最小平均切片的起始位置。如果有多個平均值最小的切片,則應返回此切片的最小起始位置。
例如,給定陣列A使得:
A[0] = 4
A[1] = 2
A[2] = 2
A[3] = 5
A[4] = 1
A[5] = 5
A[6] = 8
函數應該返回1,如上文所解釋。
假設:
- N是範圍[2..100,000]內的整數;
- 數組A的每個元素都是[-10,000..10,000]範圍內的整數。
複雜性:
- 預期最壞情況下的時間複雜度是O(N);
- 預期最壞情況下的空間複雜度爲O(N),超出輸入存儲空間(不包括輸入參數所需的存儲空間)。
輸入數組的元素可以修改。
這是我最好的解決方案,但在時間複雜度方面顯然不是最佳的。
任何想法?
public int solution(int[] A) {
int result = 0;
int N = A.length;
int [] prefix = new int [N+1];
for (int i = 1; i < prefix.length; i++) {
prefix[i] = prefix[i-1] + A[i-1];
}
double avg = Double.MAX_VALUE;
for (int i = 1; i < N; i++) {
for (int j = i+1; j <=N; j++) {
double temp = (double)(prefix[j]-prefix[i-1]) /(double)(j-i+1);
if (temp < avg) {
avg = temp;
result = i-1;
}
}
}
return result;
}
https://codility.com/demo/results/demo65RNV5-T36/
我覺得你錯過了切片(0,1),因爲你從** i = 1 **和** j = i + 1 **開始計數。而** j <= N **應該給你IndexOutOfBounds異常。 –
它工作正常。請檢查上面的鏈接。得到60分。正如我之前提到的,在時間複雜性(超時錯誤)中,只有失敗。我已經有2個反對票!尼斯......認爲這個可能對別人有用......顯然不是這種情況。 –
爲什麼所有解決方案都檢查2或3個元素的切片?有人可以向我解釋嗎?我怎樣才能得出這個結論?謝謝 – SimpleApp