題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
eg:陣列的其中的乙個旋轉陣列為,該陣列的最小值是1。
#includeusing namespace std;
int mininorder(int* numbers, int index1, int index2);
int min(int* numbers, int length)
// 如果下標為index1、index2和indexmid指向的三個數字相等,
// 則只能順序查詢
indexmid = (index1 + index2) / 2;
if(numbers[index1] == numbers[index2] && numbers[indexmid] == numbers[index1])
return mininorder(numbers, index1, index2);
// 縮小查詢範圍
if(numbers[indexmid] >= numbers[index1])
index1 = indexmid;
else if(numbers[indexmid] <= numbers[index2])
index2 = indexmid;
}return numbers[indexmid];
}int mininorder(int* numbers, int index1, int index2)
return result;
}// ********************測試**********************
void test(int* numbers, int length, int expected)
catch (...)
}int main(int argc, char* argv)
; test(array1, sizeof(array1) / sizeof(int), 1);
// 有重複數字,並且重複的數字剛好的最小的數字
int array2 = ;
test(array2, sizeof(array2) / sizeof(int), 1);
// 有重複數字,但重複的數字不是第乙個數字和最後乙個數字
int array3 = ;
test(array3, sizeof(array3) / sizeof(int), 1);
// 有重複的數字,並且重複的數字剛好是第乙個數字和最後乙個數字
int array4 = ;
test(array4, sizeof(array4) / sizeof(int), 0);
// 單調公升序陣列,旋轉0個元素,也就是單調公升序陣列本身
int array5 = ;
test(array5, sizeof(array5) / sizeof(int), 1);
// 陣列中只有乙個數字
int array6 = ;
test(array6, sizeof(array6) / sizeof(int), 2);
// 輸入null
test(null, 0, 0);
return 0;
}
在這個題目上最容易出現的錯誤就是測試用例考慮不全,使程式少了健壯性。
測試用例:
功能測試(輸入的陣列中有重複的數字或者沒有重複的數字)
邊界值測試(陣列中只包含乙個數字)
特殊輸入測試(輸入null指標)
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
旋轉陣列的最小數字
1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...