91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言二分查找法怎么用

發布時間:2022-04-19 09:07:21 來源:億速云 閱讀:165 作者:iii 欄目:開發技術

這篇文章主要講解了“C語言二分查找法怎么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言二分查找法怎么用”吧!

示例 1:

輸入: nums = [-1,0,3,5,9,12], target = 9     
輸出: 4       
解釋: 9 出現在 nums 中并且下標為 4 

示例 2:

輸入: nums = [-1,0,3,5,9,12], target = 2     
輸出: -1        
解釋: 2 不存在 nums 中因此返回 -1     

提示:

  • 你可以假設 nums中的所有元素是不重復的。

  • n將在[1, 10000]之間。

  • nums的每個元素都將在[-9999, 9999]之間。

注意讀題,數組為有序數組,且數組中無重復元素,因為一旦有重復元素,使用二分查找法返回的元素下標可能不是唯一的。

在二分查找的過程中,保持不變量,就是在 while 尋找中每一次邊界的處理都要堅持根據區間的定義來操作,這就是循環不變量規則。

寫二分法,區間的定義一般為兩種,左閉右閉即 [left, right],或者左閉右開即 [left, right)。

  • 二分法第一種寫法

第一種寫法,我們定義 target 是在一個在左閉右閉的區間里,也就是[left, right] 。因為定義 target 在 [left, right] 區間,所以有如下兩點:

while (left <= right) 要使用 <= ,因為left == right是有意義的,所以使用 <=

if (nums[middle] > target) ,right 要賦值為 middle - 1,因為當前這個 nums[middle] 一定不是 target ,那么接下來要查找的左區間結束下標位置就是 middle - 1

// 版本一
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1; // 定義target在左閉右閉的區間里,[left, right]
        while (left <= right) { // 當left==right,區間[left, right]依然有效,所以用 <=
            int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
            if (nums[middle] > target) {
                right = middle - 1; // target 在左區間,所以[left, middle - 1]
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右區間,所以[middle + 1, right]
            } else { // nums[middle] == target
                return middle; // 數組中找到目標值,直接返回下標
            }
        }
        // 未找到目標值
        return -1;
    }
};
  • 二分法第二種寫法

如果說定義 target 是在一個在左閉右開的區間里,也就是[left, right) ,那么二分法的邊界處理方式則截然不同。

有如下兩點:

while (left < right),這里使用 < ,因為 left == right 在區間 [left, right) 是沒有意義的

if (nums[middle] > target) ,right 更新為 middle,因為當前 nums[middle] 不等于 target,去左區間繼續尋找,而尋找區間是左閉右開區間,所以 right 更新為 middle,即:下一個查詢區間不會去比較 nums[middle]

// 版本二
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size(); // 定義target在左閉右開的區間里,即:[left, right)
        while (left < right) { // 因為left == right的時候,在[left, right)是無效的空間,所以使用 <
            int middle = left + ((right - left) >> 1);
            if (nums[middle] > target) {
                right = middle; // target 在左區間,在[left, middle)中
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右區間,在[middle + 1, right)中
            } else { // nums[middle] == target
                return middle; // 數組中找到目標值,直接返回下標
            }
        }
        // 未找到目標值
        return -1;
    }
};

通過以上兩種方法,要注意它們不同的地方:

① right 的初始值不一樣

② 左右區間的更新值的差別

感謝各位的閱讀,以上就是“C語言二分查找法怎么用”的內容了,經過本文的學習后,相信大家對C語言二分查找法怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

闵行区| 苗栗市| 怀仁县| 诸城市| 乡城县| 辰溪县| 明溪县| 台安县| 盐津县| 洪湖市| 隆林| 梁山县| 南江县| 永定县| 黔江区| 长海县| 泗洪县| 宁津县| 马山县| 德保县| 白朗县| 西藏| 元江| 宣威市| 崇信县| 青海省| 玉田县| 开阳县| 阿勒泰市| 伊通| 桂东县| 达拉特旗| 慈溪市| 翁牛特旗| 宜兴市| 石嘴山市| 伊川县| 沙田区| 栾城县| 重庆市| 农安县|