旋轉陣列最小數字
乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。
首先能想到的就是順序遍歷,陣列中最小的元素即為整個旋轉陣列的最小元素,但演算法時間複雜度為o(n);
由旋轉陣列的特性,因為經排序好的陣列旋轉得到的,所以由其特性可以知道,除了不旋轉的情況(即原陣列),旋轉陣列可以劃分為兩個排序的子陣列,前面的子陣列元素均大於後面的子陣列元素,存在分界線,所以可以想到的就是利用二分查詢法,實現時間複雜度為o(logn);
注意考慮以下幾種情況的處理:
1)陣列元素為空的情況,(判斷,直接返回0);
2)陣列元素只有乙個的情況,(判斷,直接返回該元素);
3)陣列旋轉0個元素,也就是沒有旋轉的情況,(最後返回mid對應的值,所以初始時令mid=low,遇到該情況while條件不成立,依然返回mid對應的值
矩陣中路徑
是乙個可以用回朔法解決的典型題。
//1. 首先,在矩陣中任選乙個格仔作為路徑的起點。如果路徑上的第i個字元不是ch,那麼這個格仔不可能處在路徑上的第i個位置。如果路徑上的第i個字元正好是ch,那麼往相鄰的格仔尋找路徑上的第i+1個字元。除在矩陣邊界上的格仔之外,其他格仔都有4個相鄰的格仔。重複這個過程直到路徑上的所有字元都在矩陣中找到相應的位置。
//2. 由於回朔法的遞迴特性,路徑可以被開成乙個棧。當在矩陣中定位了路徑中前n個字元的位置之後,在與第n個字元對應的格仔的周圍都沒有找到第n+1個字元,這個時候只要在路徑上回到第n-1個字元,重新定位第n個字元。
//3. 由於路徑不能重複進入矩陣的格仔,還需要定義和字元矩陣大小一樣的布林值矩陣,用來標識路徑是否已經進入每個格仔。 當矩陣中座標為(row,col)的格仔和路徑字串中相應的字元一樣時,從4個相鄰的格仔(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路徑字串中下乙個字元
//4. 如果4個相鄰的格仔都沒有匹配字串中下乙個的字元,表明當前路徑字串中字元在矩陣中的定位不正確,我們需要回到前乙個,然後重新定位。
//5. 一直重複這個過程,直到路徑字串上所有字元都在矩陣中找到合適的位置
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為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.分析 首先我們可以看到原陣列為遞增排序的,並且以...