@@ -290,10 +290,11 @@ func search(nums []int, target int) int {
290
290
*/
291
291
var search = function (nums , target ) {
292
292
// right是数组最后一个数的下标,num[right]在查找范围内,是左闭右闭区间
293
- let left = 0 , right = nums .length - 1 ;
293
+ let mid, left = 0 , right = nums .length - 1 ;
294
294
// 当left=right时,由于nums[right]在查找范围内,所以要包括此情况
295
295
while (left <= right) {
296
- let mid = left + Math .floor ((right - left)/ 2 );
296
+ // 位运算 + 防止大数溢出
297
+ mid = left + ((right - left) >> 1 );
297
298
// 如果中间数大于目标值,要把中间数排除查找范围,所以右边界更新为mid-1;如果右边界更新为mid,那中间数还在下次查找范围内
298
299
if (nums[mid] > target) {
299
300
right = mid - 1 ; // 去左面闭区间寻找
@@ -316,10 +317,11 @@ var search = function(nums, target) {
316
317
*/
317
318
var search = function (nums , target ) {
318
319
// right是数组最后一个数的下标+1,nums[right]不在查找范围内,是左闭右开区间
319
- let left = 0 , right = nums .length ;
320
+ let mid, left = 0 , right = nums .length ;
320
321
// 当left=right时,由于nums[right]不在查找范围,所以不必包括此情况
321
322
while (left < right) {
322
- let mid = left + Math .floor ((right - left)/ 2 );
323
+ // 位运算 + 防止大数溢出
324
+ mid = left + ((right - left) >> 1 );
323
325
// 如果中间值大于目标值,中间值不应在下次查找的范围内,但中间值的前一个值应在;
324
326
// 由于right本来就不在查找范围内,所以将右边界更新为中间值,如果更新右边界为mid-1则将中间值的前一个值也踢出了下次寻找范围
325
327
if (nums[mid] > target) {
@@ -340,9 +342,10 @@ var search = function(nums, target) {
340
342
341
343
``` typescript
342
344
function search(nums : number [], target : number ): number {
343
- let left: number = 0 , right: number = nums .length - 1 ;
345
+ let mid : number , left: number = 0 , right: number = nums .length - 1 ;
344
346
while (left <= right ) {
345
- let mid: number = left + Math .floor ((right - left ) / 2 );
347
+ // 位运算 + 防止大数溢出
348
+ mid = left + ((right - left ) >> 1 );
346
349
if (nums [mid ] > target ) {
347
350
right = mid - 1 ;
348
351
} else if (nums [mid ] < target ) {
@@ -359,9 +362,10 @@ function search(nums: number[], target: number): number {
359
362
360
363
``` typescript
361
364
function search(nums : number [], target : number ): number {
362
- let left: number = 0 , right: number = nums .length ;
365
+ let mid : number , left: number = 0 , right: number = nums .length ;
363
366
while (left < right ) {
364
- let mid: number = left + Math .floor ((right - left ) / 2 );
367
+ // 位运算 + 防止大数溢出
368
+ mid = left + ((right - left ) >> 1 );
365
369
if (nums [mid ] > target ) {
366
370
right = mid ;
367
371
} else if (nums [mid ] < target ) {
0 commit comments