B 2 基礎演算法 2 二分查詢擴充套件

2022-08-31 06:00:14 字數 2101 閱讀 2533

題目

排序陣列中查詢數字是否存在

排序陣列中查詢某數左右邊界

排序陣列中查詢某數出現的次數

區域性極小值問題

旋轉排序陣列中最小值

真尼瑪!!!思路很簡單,細節是魔鬼

寫**的時候,要定好你的搜尋區間,[l,r]還是[l,r),不同情況的細節也不一樣

r = array.size() / r = arr.size()-1 ;

while(l < r) / while(l <= r)

r = mid; / r= mid +1;

[l,r]

[l,r)

r = array.size();

r = arr.size()-1 ;

while(l < r)

while(l <= r)

r = mid;

r= mid +1;

題目1 二分查詢

public:

int search(vector& nums, int target) else if (nums[mid] < target)

}return -1;

}};

class solution else if ( nums[mid] < target )

}return -1;

}};

題目2 在有序陣列中查詢target的左右邊界/求target的數量
class solution 

// 找到target的左邊界[l,r]

int find_left(vector& nums ,int target)

else

}return ans;

}// 找到target的右邊界

int find_right(vector& nums , int target)

else

}return ans;

}// 找到target的左邊界

int find_left2(vector& nums ,int target)

else

}return ans;

}// 找到target的右邊界

int find_right2(vector& nums , int target)

else

}return ans;

}};};

題目3 旋轉陣列的最小值(二分法的擴充套件)

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

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

例如,陣列 [3,4,5,1,2] 為 [1,2,3,4,5] 的乙個旋轉,該陣列的最小值為1

class solution 

// 原陣列只有乙個元素的情況

if (numbers.size() == 1)

int l = 0 ;

int r = numbers.size()-1;

int mid = 0;

// 原陣列沒有旋轉的情況

if ( numbers[l] < numbers[r] )

// 一般情況

// l 和 r 分別在大數區域和小數區域

// 小數區域的最大值是numbers[r]

// 中位數比這個數大,就是在大於區域,中位數比這個數小,就是在小於區域

// 中位數等於numbers[r] , 是沒辦法判斷的. 就把 r 往前移動一位

// 當l移動到大數區的最右邊,r移動到小數區的最左邊,返回numbers[r]就可以了

while ( r > l+1 )

else if (numbers[mid] > numbers[r] )else if (numbers[mid] < numbers[r])

}return numbers[r];

}};

演算法2(二分查詢法)

必須是乙個已經排好序的陣列 從有序列表的候選區data 0 n 開始,通過對待查詢的值與候選區中間值的比較,可以使候選區減少一半。示例圖 def bin serach data set,val 二分查詢法 param data set 傳入乙個已經拍好序的陣列 param val 目標值 retur...

演算法2 二分查詢法

二分法 關鍵 根據比較結果決定新的左 右邊界 時間複雜度 o logn 重要特點 一定要有序 模板lc704 查詢陣列中是否存在目標值 首先檢查是否空陣列 進入迴圈 小技巧 mid l r l 2 防止 l r 2超出int型別的範圍 迴圈條件 l r。class solution int l 0,...

二分查詢 2

v1中使用while迴圈的方式,我們也可以不使用迴圈,使用遞迴的方式來實現 public static intbinarysearch v2 int array,int value public static intmysearch int array,int start,int end,int v...