題目
排序陣列中查詢數字是否存在
排序陣列中查詢某數左右邊界
排序陣列中查詢某數出現的次數
區域性極小值問題
旋轉排序陣列中最小值
真尼瑪!!!思路很簡單,細節是魔鬼
寫**的時候,要定好你的搜尋區間,[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...