Leetcode 5 二分搜尋篇

2022-09-18 06:33:40 字數 2079 閱讀 6810

因為我們初始化 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 矩陣中,是否存在乙個目標值。該矩陣具有如下特性 每行中的整數從左...