刷題記錄09(C )

2021-10-11 02:31:32 字數 1729 閱讀 8974

牛客網刷題

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

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

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 總結 對於多行資料輸入的...