二分查詢總結

2022-07-20 06:27:10 字數 1245 閱讀 9843

二分的主要細節在於左右區間的選擇。 如leetcode704.

原題鏈結

var search = function(nums, target) else;

};return -1;

};

主要的要點在於要清楚查詢的區間。這裡是乙個前閉合後閉合。

除了基本的排序不重複陣列中查詢值,還有一種在排序重複陣列中查詢值的左右邊界。

如[1,2,3,3,3,3,4,5]陣列,給定值3,求查詢出該陣列中第一次出現3這個值的位置。該種查詢叫做左側邊界查詢。這種做法可以選擇二分,也可以選擇遍歷。遍歷的時間複雜度過高,要o(n)。

var search = function(nums,target)else if(nums[mid] < target)else if(nums[mid] > target);

}return left;

}

同樣是採用左閉右開,別的地方都容易推理,主要是返回值與之前不同。因為是左閉右開區間,並且整體是左區間在收縮,因此要找的值會在left和right的左側,因此要減1.

var right_bound = function(nums, target) else if(nums[mid] < target)else if(nums[mid] > target)

};return left - 1;//返回右邊界

}

leetcode的原題:搜尋旋轉排序陣列

本質上仍然是基礎的二分查詢,只是旋轉陣列中,存在乙個大段和小段的問題,,因此多了一步中點值位於哪一塊的問題。

var search = function(nums, target) else 

}else if(nums[start] > nums[mid])else }}

return -1;

};

leetcode的原題: 搜尋旋轉排序陣列ii

本題是上一題的變種,多了乙個重複數字,因此在判斷大小段的時候,不能使用<= 。對於==的情況要特殊另外處理。

var search = function(nums, target) else

}else if (nums[start] > nums[mid])else

}else if(nums[start] === nums[mid]);

};return false;

};

二分查詢總結

今天上csdn,發現一篇關於二分查詢演算法的文章被置頂,回帖也相當熱烈。我覺得演算法總重要的還是要了解思想,至於程式設計技巧則是其次。二分查詢在計算中演算法中的重要性不言而喻,許多變形的演算法都是基於此演變的,比如二分查詢樹等。所以此演算法程式我也打算總結一下。當然經典的演算法討論莫過於jon be...

二分查詢總結

我們假設乙個最簡單的環境,對於數x,按要求詢問它在乙個陣列a 假設從小到大 裡的位置,陣列個數為n。1.查詢最後乙個小於x的數的位置 常見的一種要求。返回小於x的其中的最右邊乙個數的下標。int half int x return r 2.查詢最後乙個小於或等於x的數的位置 返回小於或等於x的其中的...

二分查詢總結

二分查詢其實並不簡單 這個演算法有很多版本 而且變化也比較多 稍一不留神就容易寫錯 這裡總結一下 一般二分查詢 binary serach int f int array,int key,int len else cout return 1 注意判斷條件必須要這麼寫 因為比如奇數個元素 1,3,5 ...