您好,登錄后才能下訂單哦!
題目描述:把一個數組最開始的若干個元素移動到數組的末尾,稱之為一個數組的旋轉。輸入一個遞增排序的數組的旋轉,輸出旋轉數組的最小元素。
例如:數組 {3,4,5,1,2} 為{1,2,3,4,5} 的一個旋轉,該數組的最小元素為 1。
分析:
int Min(int* numbers, int length) { if(numbers == NULL || length <= 0) throw new std::exception("Invalid parameters"); int index1 = 0; int index2 = length - 1; int indexMid = index1; while(numbers[index1] >= numbers[index2]) { // 如果index1和index2指向相鄰的兩個數, // 則index1指向第一個遞增子數組的最后一個數字, // index2指向第二個子數組的第一個數字,也就是數組中的最小數字 if(index2 - index1 == 1) { indexMid = index2; break; } // 如果下標為index1、index2和indexMid指向的三個數字相等, // 則只能順序查找 indexMid = (index1 + index2) / 2; // 縮小查找范圍 if(numbers[indexMid] >= numbers[index1]) index1 = indexMid; else if(numbers[indexMid] <= numbers[index2]) index2 = indexMid; } return numbers[indexMid]; }
int Min(int* numbers, int length) { if(numbers == NULL || length <= 0) throw new std::exception("Invalid parameters"); int index1 = 0; int index2 = length - 1; int indexMid = index1; while(numbers[index1] >= numbers[index2]) { // 如果index1和index2指向相鄰的兩個數, // 則index1指向第一個遞增子數組的最后一個數字, // index2指向第二個子數組的第一個數字,也就是數組中的最小數字 if(index2 - index1 == 1) { indexMid = index2; break; } // 如果下標為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) { int result = numbers[index1]; for(int i = index1 + 1; i <= index2; ++i) { if(result > numbers[i]) result = numbers[i]; } return result; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。