因為我們初始化 right = nums.length - 1
所以決定了我們的「搜尋區間」是 [left, right]
所以決定了 while (left <= right)
同時也決定了 left = mid+1 和 right = mid-1
因為我們只需找到乙個 target 的索引即可
所以當 nums[mid] == target 時可以立即返回
int binarysearch(int nums, int target)
return -1;
}
因為我們初始化 right = nums.length
所以決定了我們的「搜尋區間」是 [left, right)
所以決定了 while (left < right)
同時也決定了 left = mid + 1 和 right = mid
因為我們需找到 target 的最左側索引
所以當 nums[mid] == target 時不要立即返回
而要收緊右側邊界以鎖定左側邊界
int left_bound(int nums, int target) else if (nums[mid] < target) else if (nums[mid] > target)
}// target 比所有數都大
if (left == nums.length) return -1;
// 類似之前演算法的處理方式
return nums[left] == target ? left : -1;
}
因為我們初始化 right = nums.length
所以決定了我們的「搜尋區間」是 [left, right)
所以決定了 while (left < right)
同時也決定了 left = mid + 1 和 right = mid
因為我們需找到 target 的最右側索引
所以當 nums[mid] == target 時不要立即返回
而要收緊左側邊界以鎖定右側邊界
又因為收緊左側邊界時必須 left = mid + 1
所以最後無論返回 left 還是 right,必須減一
int right_bound(int nums, int target) else if (nums[mid] < target) else if (nums[mid] > target)
}return left - 1; // 注意
}
對於尋找左右邊界的二分搜尋,常見的方式是使用左閉右開的「搜尋區間」,下面的統一模板將「搜尋區間」全部統一成了兩端都閉,便於記憶,只需修改兩處即可變化出3種寫法。
int binary_search(int nums, int target) else if (nums[mid] > target) else if(nums[mid] == target)
}// 直接返回
return -1;
}int left_bound(int nums, int target) else if (nums[mid] > target) else if (nums[mid] == target)
}// 最後要檢查 left 越界的情況
if (left >= nums.length || nums[left] != target)
return -1;
return left;
}int right_bound(int nums, int target) else if (nums[mid] > target) else if (nums[mid] == target)
}// 最後要檢查 right 越界的情況
if (right < 0 || nums[right] != target)
return -1;
return right;
}
我寫了首詩,讓你閉著眼睛也能寫對二分搜尋 :: labuladong的演算法小抄
leetcode 二分搜尋樹
二分搜尋樹勢一顆典型的二叉樹,二分搜尋樹根節點的值大於左孩子節點的值,小於右孩子節點的值,插入 刪除 查詢的時間複雜度都是log n 建立,插入 思路 首先初始化第乙個節點,然後第二個節點要插入樹中需要找到要插入位置的根節點,有乙個查詢的過程,然後根據值的大小分別放在左右子樹 param a par...
LeetCode 二分查詢篇(69 33 704)
實現 int sqrt int x 函式。計算並返回 x 的平方根,其中 x 是非負整數。由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。示例 1 輸入 4 輸出 2 示例 2 輸入 8 輸出 2 說明 8 的平方根是 2.82842.由於返回型別是整數,小數部分將被捨去。時間複雜度o ...
leetcode專題訓練 二分搜尋
1 35.搜尋插入位置 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。2 74.搜尋二維矩陣 編寫乙個高效的演算法來判斷 m x n 矩陣中,是否存在乙個目標值。該矩陣具有如下特性 每行中的整數從左...