0、leetcode 704 二分查詢
給定乙個 n 個元素有序的(公升序)整型陣列 nums 和乙個目標值 target ,寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 -1。
class
solution
if(target > nums[mid]
)else
}return-1
;// 沒有找到}}
;
明確變數的含義,維護迴圈不變數,小資料量除錯,大資料量測試。
上面的**時在【left,right】中尋找target, 下面的**是在【left, right)中尋找target。
class
solution
if(target > nums[mid]
)else
}return-1
;// 沒有找到}}
;
/*************************最基本的二分查詢*********************************/
intbinarysearchup
(int
* nums,
int numslen,
int key)
else
if(key < nums[mid]
)else
}return-1
;}intbinarysearchdown
(int
* nums,
int numslen,
int key)
else
if(key < nums[mid]
)else
}return-1
;}intbinarysearchuprecursive
(int
* nums,
int low,
int high,
int key)
int mid = low +
(high - low)/2
;//計算mid的位置
if(key == nums[mid]
)else
if(key > nums[mid]
)else
}
2-1、查詢目標值區域的左邊界 = 查詢與目標值相等的第乙個元素位置 = 查詢第乙個不小於目標值的元素位置/*************************查詢目標值區域的左邊界*******************************************/
/*************************查詢與目標值相等的第乙個元素位置*********************************/
/*************************查詢第乙個不小於目標值的元素位置*********************************/
intbinarysearchlowerbound
(int
* nums,
int numslen,
int key)
else}if
(nums[low]
== key)
else
}
2-2、查詢目標值區域的右邊界 = 查詢與目標值相等的最後乙個元素位置 = 查詢第乙個不大於目標值的元素位置/*************************查詢目標值區域的右邊界*******************************************/
/*************************查詢與目標值相等的最後乙個元素位置*********************************/
/*************************查詢第乙個不大於目標值的元素位置*********************************/
intbinarysearchupperbound
(int
* nums,
int numslen,
int key)
else}if
(key == nums[high]
)else
}
2-3、查詢第乙個大於目標值的數 = 查詢比目標值大但是最接近目標值的數/*************************查詢第乙個大於目標值的數*******************************************/
/*************************查詢比目標值大但是最接近目標值的數*********************************/
/*我們已經找到了最後乙個不大於目標值的數,那麼再往後進一位,
返回high + 1,就是第乙個大於目標值的數。*/
intbinarysearchbiggerone
(int
* nums,
int numslen,
int key)
else}if
(high+
1< numslen && key == nums[high]
)else
}
2-4、查詢最後乙個小於目標值的數 = 查詢比目標值小但是最接近目標值的數/*************************查詢最後乙個小於目標值的數*******************************************/
/*************************查詢比目標值小但是最接近目標值的數*********************************/
intbinarysearchlessone
(int
* nums,
int numslen,
int key)
else}if
(low -
1>=
0&& key == nums[low]
)else
}
3-1、查詢旋轉陣列的最小值元素下標(假設不存在重複數字)/*************************查詢旋轉陣列的最小值元素下標(假設不存在重複數字)*********************************/
intbinarysearchrotateminunique
(int
* nums,
int numslen)
else
}return high;
//此時low=high,寫return high;一樣的
}
3-2、查詢旋轉陣列的最小值元素下標(假設存在重複數字)/*************************查詢旋轉陣列的最小值元素下標(假設存在重複數字)*********************************/
intbinarysearchrotateminrepeated
(int
* nums,
int numslen)
else
if(nums[mid]
< nums[high]
)else
}return low;
}
3-3、在旋轉排序陣列中搜尋(假設不存在重複數字)/*************************在旋轉排序陣列中搜尋(假設不存在重複數字)*********************************/
intbinarysearchkeyinrotateunique
(int
* nums,
int numslen,
int key)
else
if(nums[low]
<= nums[mid]
)else
}else
if(nums[mid]
<= nums[high]
)else}}
return-1
;}
3-4、在旋轉排序陣列中搜尋(假設存在重複數字)/*************************在旋轉排序陣列中搜尋(假設存在重複數字)*********************************/
bool
binarysearchkeyinrotaterepeat
(int
* nums,
int numslen,
int key)
else
if(nums[low]
< nums[mid]
)else
}else
if(nums[mid]
< nums[high]
)else
}else
}return
false
;}
4、測試以上的函式#include
using
namespace std;
假裝這裡有上述的所有函式
intmain()
;int data2=
;int data3=
;int data4=
;int data5=
; 這裡呼叫函式即可
bool num =
binarysearchkeyinrotaterepeat
(data5,13,
2);//此種情況顯示的是有或無
cout <<
"index of the number is "
<< num <<
"."
("pause");
return0;
}
資料結構與演算法 二分查詢
二分查詢的思想是在已經排序 公升序 的陣列中,如果要查詢的數比中位數小,那麼其位置只可能在左半部分,相反只能在右半部分。這樣每次把查詢區間縮小一半,比順序查詢效率快得多。非遞迴寫法 public static int binarysearchinasclooply int nums,int star...
資料結構與演算法,二分查詢
1.時間複雜度 每次能去掉一半即 logn 2.實現方式 while迴圈 與 遞迴 我更推薦 while 迴圈,因為遞迴有個潛在的問題就是 stack over flow 堆疊溢位 而且在實際工程中是盡量避免遞迴的。雖然遞迴寫起來方便,也不容易出錯。3.實現關鍵點 我總結了下,一共有以下四點 sta...
資料結構與演算法 二分查詢
基礎概念 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用陣列作為表的儲存結構。不妨設有序表是遞增有序的。通俗理解 每次首先找到陣列的中間位置 middle 然後把待查詢數 target 與middle進行比較。如果查詢數target ...