刷题-力扣-面试题 10.05. 稀疏数组搜索

题目链接

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sparse-array-search-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述

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

示例1:

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

示例2:

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

提示:

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

题目分析

  1. 根据题目描述,在有序稀疏数组中1查找指定值
  2. 二分查找,当二分的中间结点是稀疏值时,定位中间结点到左侧相邻第一个结点

代码

class Solution {
public:
    int findString(vector<string>& words, string s) {
        int left = 0;
        int right = words.size() - 1;
        int mid = 0;
        // 找到第一个有效的字符串位置
        while (left <= right && words[left] == "") { ++left; }
        // 找到最后一个有效的字符串位置
        while (right >= left && words[right] == "") { --right; }
        // 二分查找指定的字符串位置
        while (left <= right) {
            mid = left + (right - left) / 2;
            while (mid >= left && words[mid] == "") { --mid; }
            if (words[mid] == s) { return mid; }
            else if (words[mid] > s) {
                right = mid - 1;
                while (right >= left && words[right] == "") { --right; }
            }
            else {
                left = mid + 1;
                while (left <= right && words[left] == "") { ++left; }
            }
        }
        return -1;
    }
};
posted @ 2022-03-08 15:00  韩亚光  阅读(50)  评论(0编辑  收藏  举报