題目描述
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列rotatearray的最小元素。
例如陣列[3,4,5,1,2]為[1,2,3,4,5]的乙個旋轉,該陣列的最小值為1。
note:給出的所有元素都大於0,若陣列大小為0,請返回0。
思路:考察二分,當然遍歷也能做,但你說要是考遍歷用得著這樣出題麼…
1、這裡的非遞減指第n+1個元素必然不小於第n個元素
2、由題意得,陣列旋轉後可以看做由前後a、b兩個非遞減陣列構成,且a中第乙個元素(也就是最小的)也不小於b中最後乙個元素(也就是最大的)。
3、令left = 0 , right = (長度-1)。
令mun = (left+right)/2 ;
若rotatearray[left] < rotatearray[mun] , 則mun位於陣列a部分,令left = mun,繼續;
若rotatearray[left] > rotatearray[mun] , 則mun位於陣列b部分,令right = mun,繼續;
直到 right-left = 1,此時left指向陣列a的最後乙個元素,right指向陣列b的第乙個元素,也就是最小值。
上述沒有提到rotatearray[left] = rotatearray[mun] ,因為這是非遞減陣列,出現等於說明裡面出現了大小相等的元素,不能用二分了,如果出現等於姑且先用遍歷找出 left 到 right 中的最小值,這樣一來二分只起到了縮小範圍的作用。
(其實還可能有一種情況,就是整個陣列完全旋轉了一次,變的和原來一樣,也沒有什麼a、b之分了,第乙個元素就是最小的。不過用例中應該是沒出現。要排除這種情況可以比較第乙個元素是否小於最後乙個元素,如果是,就是這種情況了)
class solution
}return rotatearray[right];}
};
牛客《劍指Offer》 用兩個棧實現佇列
用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。棧的資料是後進先出的,所以利用兩個棧的配合可以實現佇列先進先出的效果。所有存入的資料,均壓入棧stack1。要取出資料時,開始stack2為空,將所有stack1中的資料取出,以此壓入stack2 中,這些資料再從st...
劍指offer JZ5 用兩個棧實現佇列
用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。c class solution int pop t stack2.top stack2.pop return t private stackstack1 stackstack2 思路 兩個棧乙個棧用來進隊,另乙個棧用...
牛客劍指OFFER JZ2 替換空格
題目描述 思路1 從頭開始 1 新建乙個陣列p,從頭開始遍歷原陣列str 2 若str中某位置資料不為空格,則p中對應位置改為該資料 3 若str中某位置資料為空格,則p中對應位置改為 20,可用strcat代勞 4 最後把p中內容拷到str中,用strcpy 優點 簡單好想。void replac...