|
11 | 11 | - 3、比较中点和目标值:A[mid] ==、 <、> target
|
12 | 12 | - 4、判断最后两个元素是否符合:A[start]、A[end] ? target
|
13 | 13 |
|
14 |
| -时间复杂度 O(logn),使用场景一般是有序数组的查找 |
| 14 | +时间复杂度 O(logn),使用场景一般是有序数组的查找。 |
15 | 15 |
|
16 |
| -##### 704.二分查找 [binary-search](https://leetcode-cn.com/problems/binary-search/) |
| 16 | +##### [704.二分查找(经典示例)](https://leetcode-cn.com/problems/binary-search/) |
17 | 17 |
|
18 | 18 | ```js
|
19 | 19 | // 二分搜索最常用模板
|
@@ -43,28 +43,30 @@ var search = function(nums, target) {
|
43 | 43 |
|
44 | 44 | 大部分二分查找类的题目都可以用这个模板,然后做一点特殊逻辑即可。
|
45 | 45 |
|
46 |
| -**模板 #1** (left <= right) |
| 46 | +**模板 #1** `(left <= right)` |
47 | 47 |
|
48 | 48 | 二分查找的最基础和最基本的形式。
|
49 | 49 | 查找条件可以在不与元素的两侧进行比较的情况下确定(或使用它周围的特定元素)。
|
50 | 50 | 不需要后处理,因为每一步中,你都在检查是否找到了元素。如果到达末尾,则知道未找到该元素。
|
51 | 51 |
|
52 |
| -**模板 #2** (left < right) |
| 52 | +**模板 #2** `(left < right)` |
53 | 53 |
|
54 | 54 | 一种实现二分查找的高级方法。
|
55 | 55 | 查找条件需要访问元素的直接右邻居。
|
56 | 56 | 使用元素的右邻居来确定是否满足条件,并决定是向左还是向右。
|
57 | 57 | 保证查找空间在每一步中至少有 2 个元素。
|
58 | 58 | 需要进行后处理。 当你剩下 1 个元素时,循环 / 递归结束。 需要评估剩余元素是否符合条件。
|
59 | 59 |
|
60 |
| -**模板 #3** (left + 1 < right) |
| 60 | +**模板 #3** `(left + 1 < right)` |
61 | 61 |
|
62 | 62 | 实现二分查找的另一种方法。
|
63 | 63 | 搜索条件需要访问元素的直接左右邻居。
|
64 | 64 | 使用元素的邻居来确定它是向右还是向左。
|
65 | 65 | 保证查找空间在每个步骤中至少有 3 个元素。
|
66 | 66 | 需要进行后处理。 当剩下 2 个元素时,循环 / 递归结束。 需要评估其余元素是否符合条件。
|
67 | 67 |
|
| 68 | + |
| 69 | + |
68 | 70 | 如果是最简单的二分搜索,不需要找第一个、最后一个位置、或者是没有重复元素,可以使用**模板#1**,代码更简洁:
|
69 | 71 |
|
70 | 72 | ```js
|
@@ -93,11 +95,9 @@ var search = function(nums, target) {
|
93 | 95 | };
|
94 | 96 | ```
|
95 | 97 |
|
96 |
| -##### 34.在排序数组中查找元素的第一个和最后一个位置 [find-first-and-last-position-of-element-in-sorted-array](https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/) |
97 |
| - |
98 |
| -给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 |
| 98 | +##### [34.在排序数组中查找元素的第一个和最后一个位置](https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/) |
99 | 99 |
|
100 |
| -如果数组中不存在目标值 target,返回 [-1, -1]。 |
| 100 | +给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。 |
101 | 101 |
|
102 | 102 | **进阶:**
|
103 | 103 |
|
@@ -151,3 +151,86 @@ var searchRange = function(nums, target) {
|
151 | 151 | };
|
152 | 152 | ```
|
153 | 153 |
|
| 154 | +##### [35. 搜索插入位置](https://leetcode-cn.com/problems/search-insert-position/) |
| 155 | + |
| 156 | +给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 |
| 157 | + |
| 158 | +```js |
| 159 | +var searchInsert = function (nums, target) { |
| 160 | + let left = 0, mid = 0, right = nums.length - 1 |
| 161 | + let res = 0 |
| 162 | + while (left + 1 < right) { |
| 163 | + mid = left + ((right - left) >> 1) |
| 164 | + if (nums[mid] < target) { |
| 165 | + left = mid |
| 166 | + } else { |
| 167 | + right = mid |
| 168 | + } |
| 169 | + } |
| 170 | + if (target <= nums[left]) { |
| 171 | + return left |
| 172 | + } else if (target <= nums[right]) { |
| 173 | + return right |
| 174 | + } else { |
| 175 | + return right + 1 |
| 176 | + } |
| 177 | +}; |
| 178 | +``` |
| 179 | + |
| 180 | +##### [74. 搜索二维矩阵](https://leetcode-cn.com/problems/search-a-2d-matrix/) |
| 181 | + |
| 182 | +编写一个高效的算法来判断 `m x n` 矩阵中,是否存在一个目标值。 |
| 183 | + |
| 184 | +```js |
| 185 | +var searchMatrix = function (matrix, target) { |
| 186 | + let row = matrix.length |
| 187 | + let col = matrix[0].length |
| 188 | + let start = 0 |
| 189 | + let end = row * col - 1 |
| 190 | + let mid = 0 |
| 191 | + while (start + 1 < end) { |
| 192 | + mid = start + ((end - start) >> 1) |
| 193 | + val = matrix[parseInt(mid / col)][mid % col] |
| 194 | + if (val > target) { |
| 195 | + end = mid |
| 196 | + } else if (val < target) { |
| 197 | + start = mid |
| 198 | + } else { |
| 199 | + return true |
| 200 | + } |
| 201 | + } |
| 202 | + if (matrix[parseInt(start / col)][start % col] === target || matrix[parseInt(end / col)][end % col] === target) { |
| 203 | + return true |
| 204 | + } |
| 205 | + return false |
| 206 | +}; |
| 207 | +``` |
| 208 | + |
| 209 | +##### [278. 第一个错误的版本](https://leetcode-cn.com/problems/first-bad-version/) |
| 210 | + |
| 211 | +```js |
| 212 | +var solution = function (isBadVersion) { |
| 213 | + /** |
| 214 | + * @param {integer} n Total versions |
| 215 | + * @return {integer} The first bad version |
| 216 | + */ |
| 217 | + return function (n) { |
| 218 | + let start = 1 |
| 219 | + let end = n |
| 220 | + let mid = 1 |
| 221 | + while (start + 1 < end) { |
| 222 | + mid = start + ((end - start) >> 1) |
| 223 | + if(isBadVersion(mid)){ |
| 224 | + end = mid |
| 225 | + } else { |
| 226 | + start = mid |
| 227 | + } |
| 228 | + } |
| 229 | + if(isBadVersion(start)){ |
| 230 | + return start |
| 231 | + } |
| 232 | + return end |
| 233 | + }; |
| 234 | +}; |
| 235 | +``` |
| 236 | + |
0 commit comments