牛客網刷題
【題目】:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
note:給出的所有元素都大於0,若陣列大小為0,請返回0。
【解題思路】:
這種二分查詢難就難在,arr[mid]跟誰比.
我們的目的是:當進行一次比較時,一定能夠確定答案在mid的某一側。一次比較為 arr[mid]跟誰比的問題。
一般的比較原則有:
如果有目標值target,那麼直接讓arr[mid] 和 target 比較即可。
如果沒有目標值,一般可以考慮 端點把target 看作是右端點,來進行分析,那就要分析以下三種情況,看是否可以達到上述的目標。
情況1,arr[mid] > target:4 5 6 1 2 3
arr[mid] 為 6, target為右端點 3, arr[mid] > target, 說明[first … mid] 都是 >= target 的,因為原始陣列是非遞減,所以可以確定答案為 [mid+1…last]區間,所以 first = mid + 1
情況2,arr[mid] < target:5 6 1 2 3 4
arr[mid] 為 1, target為右端點 4, arr[mid] < target, 說明答案肯定不在[mid+1…last],但是arr[mid] 有可能是答案,所以答案在[first, mid]區間,所以last = mid;
情況3,arr[mid] == target:
如果是 1 0 1 1 1, arr[mid] = target = 1, 顯然答案在左邊
如果是 1 1 1 0 1, arr[mid] = target = 1, 顯然答案在右邊
所以這種情況,不能確定答案在左邊還是右邊,那麼就讓last = last - 1;慢慢縮少區間,同時也不會錯過答案。
【**及分析】:
class
solution
int mid = first +
((last - first)
>>1)
;if(rotatearray[mid]
> rotatearray[last]
)else
if(rotatearray[mid]
< rotatearray[last]
)else
}return rotatearray[first];}
};
【總結】 這題主要考查的二分查詢演算法的應用。了解到,二分查詢也是折半查詢,它是一種效率高的查詢方法、
演算法原理:1.如果待查序列為空,那麼就返回-1,並退出演算法;這表示查詢不到目標元素。
2.如果待查序列的目標元素進行匹配,看它們是否相等。
3.如果相等,則返回該中間元素的索引,並退出演算法;此時就查詢成功了。
4.如果不相等,就再比較這兩個元素的大小。
5.如果該中間元素大於目標元素,那麼就當前序列的前半部分作為新的待查序列;這是因為後半部分的所有元素都大於目標元素。它們全部被排除了。
6.如果該中間元素小於目標元素,那麼就將當前序列的後半部分作為新的待查序列;這是因為前半部分的所有元素都小於目標元素。它們都被排除了。
7.在新的待查序列上重新開始第一步的工作。
二分查詢之所以快速,是因為他在匹配不成功的時候都能排除元素中一半的元素。因此可能包含目標元素的有效範圍就縮放得很快,而不像順序查詢那樣,每次僅能排除乙個元素。
LeetCode刷題記錄一(C)
1 給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 note the returned array m...
刷題記錄(C )02
牛客網刷題 劍指offer 1.題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。2.解題思路 從前序遍歷可知,前序遍歷陣列pre的首元素就是二叉樹的根結點,然後根據根結點的值...
刷題記錄21(C )
題目描述 從鍵盤任意輸入乙個字元,程式設計判斷是否是字母 包括大小寫 輸入描述 多組輸入,每行輸入包括乙個字元。輸出描述 針對每行輸入,輸出該字元是字母 yes 或不是 no 及分析 include using namespace std int main return 0 總結 對於多行資料輸入的...