二分法:
關鍵:根據比較結果決定新的左/右邊界
時間複雜度:o(logn)
重要特點:一定要有序
模板lc704 查詢陣列中是否存在目標值
首先檢查是否空陣列
進入迴圈:
小技巧:mid = l + (r-l)/2 防止(l+r)/2超出int型別的範圍
迴圈條件:l<=r。
class solutionlc35搜尋插入位置int l = 0, r = nums.size()-1, mid = 0;
while(l <= r)
else if(nums[mid] > target)
else
}return -1;}};
如果目標值不存在,返回按照順序,它將被插入的位置
例子:
邊界條件:
迴圈條件: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但是mid和mid+1的問題:……int search(vector& nums, int l, int r)
int mid = l + (r - l) / 2;
if(nums[mid] > nums[mid + 1])
else}};
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 中,然後方法...