牛客劍指OFFER JZ6 用兩個棧實現佇列

2021-10-24 08:57:18 字數 1115 閱讀 9160

題目描述

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列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...