演算法2 二分查詢法

2022-09-14 23:51:26 字數 2382 閱讀 7326

二分法:

關鍵:根據比較結果決定新的左/右邊界

時間複雜度:o(logn)

重要特點:一定要有序

模板lc704  查詢陣列中是否存在目標值

首先檢查是否空陣列

進入迴圈:

小技巧:mid = l + (r-l)/2  防止(l+r)/2超出int型別的範圍

迴圈條件:l<=r。

class solution 

int l = 0, r = nums.size()-1, mid = 0;

while(l <= r)

else if(nums[mid] > target)

else

}return -1;}};

lc35搜尋插入位置

如果目標值不存在,返回按照順序,它將被插入的位置

例子:

邊界條件:

迴圈條件:l

正確的**:

class solution 

else

}return l;}};

原理……

lc162尋找峰值

返回峰值的索引;

解題思路

理解以下兩點

1、nums[mid] > nums[mid+1]降序,說明峰值在左邊

2、nums[mid] < nums[mid+1]公升序,說明峰值在右邊

假設頭尾是負無窮

普通遍曆法:

class solution 

if(nums[0]>nums[1])

if(nums[n-1] > nums[n-2])

for(int i=1;inums[i-1] && nums[i] > nums[i+1])

}return -1;}};

二分迭代法:

class solution 

else

}return l;}};

二分遞迴法:

class solution 

int search(vector& nums, int l, int r)

int mid = l + (r - l) / 2;

if(nums[mid] > nums[mid + 1])  

else}};

但是mid和mid+1的問題:……

lc74搜尋二維矩陣

二維陣列轉換成一維陣列:

二維索引改成一維索引:

正確的**:

class solution 

int m = matrix.size();

int n = matrix[0].size();

int amount = m * n;

int l = 0;

int r = amount - 1;

int mid = 0;

//***************行標號 = 虛擬陣列索引/列數 虛擬陣列索引就是mid

//***************列標號 = 虛擬陣列索引%列數

while(l <= r)

else if(matrix[row][col] > target)

else

}//沒有找到,返回false

return false;}};

虛擬陣列。

演算法2(二分查詢法)

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

演算法 二分查詢法

例題 設計乙個函式,接收乙個有序陣列和乙個元素,如果指定的元素包含在陣列中,則返回其位置。看見這道題,我們正常的想法為遍歷陣列的所有元素然後乙個乙個的與數值相比較,如果相等,返回索引,如果在迴圈執行完後沒有退出函式的話,就返回false。為 var count 0 計數 function looku...

查詢演算法 二分查詢法

二分查詢法是經典的入門演算法,以高效和廣泛應用而著稱.演算法是由靜態方法rank 實現的,它接受乙個整數鍵和乙個已經有序的int 陣列作為引數。如果該鍵存在於陣列中 則返回它的索引,否則返回 1。演算法使用兩個變數low 和high,並保證如果鍵在陣列中則它一定在 a low high 中,然後方法...