LeetCode 算法:稀疏数组搜索

175 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 9 天,点击查看活动详情

稀疏数组搜索

原题地址

稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。

示例1:

 输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], 
      s = "ta"
 输出:-1
 说明: 不存在返回-1

示例2:

 输入:words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], 
      s = "ball"
 输出:4

提示:

  • words 的长度在 [1, 1000000] 之间

思路分析

方法一

  1. 分析题目可以得知,题目的目的是为了寻找数组 words 中与字符串 s 的位置,若不存在则返回 -1
  2. 很容易想到数组的 findIndex 方法,使用数组 API 返回即可。

方法二

  1. 遍历数组来寻找与 s 相同的数组中的元素;
  2. 若有相同的,则返回 i,若没有则返回 -1

方法三

  1. 上述两种方法都是走的通用的普通的方式,跟数组没有关系;
  2. 题目中的数组是已经排序的数组,因此可以使用二分查找;
  3. 因为是稀疏数组,因此需要额外处理为空的元素。在循环得到 mid 后,需要判断 words[mid] 是否为空,若为空再进行移动;
  4. 然后再执行正常的二分查找即可。

AC 代码

方法一

/**
 * @param {string[]} words
 * @param {string} s
 * @return {number}
 */
var findString = function(words, s) {
    return words.findIndex(item => item === s)
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了71.34%的用户
  • 内存消耗:41.4 MB, 在所有 JavaScript 提交中击败了38.41%的用户
  • 通过测试用例:28 / 28

方法二

/**
 * @param {string[]} words
 * @param {string} s
 * @return {number}
 */
var findString = function(words, s) {
    for(let i = 0; i < words.length; i++) {
        if(words[i] === s) {
            return i
        }
    }
    return -1
};

结果:

  • 执行结果: 通过
  • 执行用时:88 ms, 在所有 JavaScript 提交中击败了6.10%的用户
  • 内存消耗:41.4 MB, 在所有 JavaScript 提交中击败了50.00%的用户 = 通过测试用例:28 / 28

方法三

/**
 * @param {string[]} words
 * @param {string} s
 * @return {number}
 */
var findString = function(words, s) {
    let start = 0
    let end = words.length - 1
    while (start <= end) {
        let mid = (start + end) >> 1
        while (mid > start && words[mid] === '') mid--
        if (words[mid] > s) {
            end = mid - 1
        } else if (words[mid] < s) {
            start = mid + 1
        } else {
            return mid
        }
    }
    return -1
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了71.34%的用户
  • 内存消耗:41.6 MB, 在所有 JavaScript 提交中击败了16.46%的用户
  • 通过测试用例:28 / 28

END