剑指Offer——在排序数组中查找数字I(JS实现)

简介: 剑指Offer——在排序数组中查找数字I(JS实现)

题目描述

image.png

解题思路(序列化)

  • 看到本题我首先想到的是二分查找
  • 初始化左指针指向下标0,右指针指向下标nums.length - 1;
  • 首先找到中位数下标,将中位数下标对应的值和target进行比较,如果比中位数大,right = mid - 1,如果比中位数小,left = mid + 1,如果中位数和target目标值相同则终止循环,并记录当前的中位数下标
  • 以中位数下标为flag,查找中位数左右两边和中位数相同的元素,并记录下标
  • 本题要求的就是下面的这个公式

右边界−左边界+1右边界 - 左边界 + 1+1

  • 注意有时候会有边界溢出的情况,比如右指针到达负数

序列化代码

var search = function (nums, target) {
    if (nums.length === 0) return 0;
    // 定义初始化指针
    let left = 0;
    let right = nums.length - 1;
    // 求中位数下标
    let mid = Math.floor((left + right) / 2);
    while (nums[mid] !== target) {
        if (left === right) return 0;
        if (nums[mid] < target) {
            left = mid + 1;
            if (left === nums.length) return 0;
            mid = Math.floor((left + right) / 2);
            continue;
        }
        if (nums[mid] > target) {
            right = mid - 1;
            if (right < 0) return 0;
            mid = Math.floor((left + right) / 2);
            continue;
        }
    }
    let flag = mid;
    let flag2 = mid;
    let left_border,right_border;
    while (nums[flag-1] === target) {
        flag--;
    }
    left_border = flag;
    while (nums[flag2+1] === target) {
        flag2++;
    }
    right_border = flag2;
    return right_border - left_border + 1;
};

总结(本题给我们的启示思路)

  • 启示一:学会使用二分查找
  • 启示二:考虑边界条件
相关文章
|
2月前
|
前端开发 JavaScript 算法
使用 JavaScript 数组方法实现排序与去重
【10月更文挑战第21天】通过灵活运用 `sort()` 方法和 `filter()` 方法,我们可以方便地实现数组的排序和去重。同时,深入理解排序和去重的原理,以及根据实际需求进行适当的优化,能够更好地应对不同的情况。可以通过实际的项目实践来进一步掌握这些技巧,并探索更多的应用可能性。
109 59
|
2月前
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
39 2
|
2月前
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
29 3
|
2月前
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
45 4
|
2月前
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
49 1
|
2月前
|
JavaScript 前端开发 API
JS中数组的方法flat()怎么用
JS中数组的方法flat()怎么用
23 0
|
2月前
|
JavaScript 前端开发 索引
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
31 0
|
前端开发 算法 JavaScript
JavaScript 基础排序的实现(二)
继上一篇O(n^2)的排序算法后,这一篇主要记录O(n*logn)的排序算法 1.快排(快速排序)   这一算法的核心思想为,先随机选一个数作为标兵或者说是标记(这个数一般来说选择该无序数组的中间那个元素;此处笔者选取第一个实现算法,当选取完毕后以此标兵为参照将比这个数大的放到他的右边,比他小的放到左边.
1133 0
|
JavaScript 算法 前端开发
JavaScript 基础排序的实现(一)
作为一个有追求的前端,忙里偷闲(闲得发慌)地复习了一下基础的排序算法,以此文留念. 本篇主要记录O(n²)复杂度的基础算法O(nlogn)的算法将在下次有空(闲得发慌)时更新 在记录时发现Es6语法中的解构赋值与传统的中间变量交换相比效率低下,经过几次测试发现其耗时大约为交换中间变量的两倍 1.
1395 0
|
28天前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
25 1
JavaScript中的原型 保姆级文章一文搞懂