測驗用例超時。使用了可能的無限回圈或低效演算法。 引數無法更改,某些測驗用例失敗。我哪里錯了?
int binarySearch(int p[], int n, int key) {
int l = 0, h = n - 1;
int mid = l (h - l) / 2;
while (l <= h) {
if (p[mid] == key) {
return mid;
}
if (p[mid] < key) {
l = mid 1;
}
if (p[mid] > key) {
h = mid - 1;
}
}
return -1;
}
uj5u.com熱心網友回復:
你沒有更新mid。
在二進制搜索的每次迭代中,mid應該更新到 和 的中點l,h通常類似于(l h)/2。但是,由于您尚未更新mid,它的值保持不變并永遠運行。
這會導致測驗用例超時。
uj5u.com熱心網友回復:
mid不會在回圈中更新,因此如果回圈在第一次迭代時沒有退出,它將永遠重復相同的測驗。測驗框架在最大允許時間后停止程式并報告問題。
mid應該在回圈內計算。
另請注意,第三個測驗if (p[mid] > key)是多余的,可以用一個else子句代替:
int binarySearch(int p[], int n, int key) {
int l = 0, h = n - 1;
while (l <= h) {
int mid = l (h - l) / 2;
if (p[mid] == key) {
return mid;
}
if (p[mid] < key) {
l = mid 1;
} else {
h = mid - 1;
}
}
return -1;
}
另請注意,上述函式計算的索引不一定是陣列中第一個匹配項的索引。這是一個回傳最低索引的替代方法,可以與無符號索引型別一起使用,例如size_t:
int binarySearch(int p[], int n, int key) {
int lo = 0, hi = n;
while (lo < hi) {
int mid = lo (hi - lo) / 2;
if (p[mid] < key) {
lo = mid 1;
} else {
hi = mid;
}
}
if (lo < n && p[lo] == key) {
return lo;
} else {
return -1;
}
}
uj5u.com熱心網友回復:
你永遠不會改變中間。您總是在測驗陣列的中間元素,而不是 l 和 h 之間的中點。將 mid 的分配移動到回圈中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477689.html
下一篇:通過布林值抽象運算子
