全面剖析二分法二分搜尋演算法

2021-10-05 09:30:50 字數 3321 閱讀 9363

#include

#include

#include

using

namespace std;

bool

binaryfind

(vector<

int>

& nums,

int begin,

int end,

int target)

else

if(nums[mid]

> target)

else

}return

false;}

intmain()

; vector<

int> nums =

; cout <<

binaryfind

(nums,

0, nums.

size()

-1,8

)<< endl;

return0;

}

分析:如果target存在,mid就一定能夠指向它;如果target不存在,則begin會指向target應該出現的位置。

另一種寫法,參考博文講得挺好挺清楚,如下:

#include

#include

#include

using

namespace std;

bool

binaryfind

(vector<

int>

& nums,

int begin,

int end,

int target)

int mid;

++end;

while

(begin < end)

else

}

cout << begin << endl;

return

false;}

intmain()

;//vectornums = ;

binaryfind

(nums,

0, nums.

size()

-1,33

);return0;

}

分析:如果target存在,begin就一定能夠指向它;如果存在多個重複target,begin就指向第乙個target(與下面的search_first函式功能一樣);如果target不存在,則begin會指向target應該出現的位置。

#include

#include

#include

using

namespace std;

intsearch_first

(vector<

int>

& nums,

int target)

int left =0;

int right = nums.

size()

-1;int mid;

while

(left <= right)

else}if

(left < nums.

size()

&& nums[left]

== target)

return left;

}int

main()

; vector<

int> nums =

; cout <<

search_first

(nums,0)

<< endl;

return0;

}

分析:如果存在多個target,則left指向第乙個的位置;如果不存在target,則left指向它應該出現的位置。

#include

#include

#include

using

namespace std;

intsearch_last

(vector<

int>

& nums,

int target)

int left =0;

int right = nums.

size()

-1;int mid;

while

(left <= right)

else}if

(right >=

0&& nums[right]

== target)

return left;

}int

main()

; vector<

int> nums =

; cout <<

search_last

(nums,-1

)<< endl;

return0;

}

分析:如果存在多個target,則rigth指向最後乙個的位置;如果不存在target,則left指向它應該出現的位置(沒錯,與上乙個演算法一樣,都是left指向它應該出現的位置)。

【leetcode】34. find first and last position of element in sorted array

感覺discuss的演算法更好理解一些,「find first position」和「find last position」互為映象。**如下:

// part 1和part 2是映象**

class

solution

;int i =

0, j = a.

size()

-1; vector<

int>

ret(2,

-1);

// part 1

while

(i < j)

else}if

(a[i]

!= target)

else

// part 2

j = a.

size()

-1;while

(i < j)

else

}

ret[1]

= j;

return ret;}}

;

參考:

【leetcode】34. find first and last position of element in sorted array的discuss

搜尋演算法之二分法

二分法是搜尋演算法中的最簡單演算法,其另一種稱呼為折半查詢法,實際上核心思想就是對乙個有序陣列,進行從中間分隔,然後去中間值來進行查詢,如果對應所要找的數值比中間的值大,則說明搜尋的數值在陣列的右側,如果小則說明在左側,二分查詢最重要的前提是所要搜尋的陣列資料一定要是有序的,如果是無序的話,則這個方...

二分法,二分搜尋

二分法是乙個應用很廣泛的演算法 好吧,剛說出這句話的時候,我查了一下資料,發現我了解的應用寥寥無幾.ok,既然不知道,那就下次補充把。咱們直接進入主題。二分法 bisection method 是一種方程式根的近似值求法。演算法 若要求已知函式f x 0的值則 1.先找出乙個區間 a,b 使得f a...

搜尋 二分法

input 待搜尋目標整數,目標陣列 output 找到目標整數的索引,找不到則 1 constraints 目標陣列有序排列 公升降序 二分法搜尋思想 舉例說明 你是個摸牌高手,不用掀開麻將只需用手摸就能摸出牌面,桌面扣著80個麻將牌,不同的是麻將上刻的是80個1到500的公升序不連續數字,形如 ...