稀疏矩阵搜索(两种方法解决:1.暴力+哈希 2.二分法)

题目:

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

示例:

输入: words = "at", "", "", "", "ball", "", "", "car", "", "","dad", "", "", s = "ta"

输出:-1

说明: 不存在返回-1。

输入:words = "at", "", "", "", "ball", "", "", "car", "", "","dad", "", "", s = "ball"

输出:4

解题思路:

首先,简单的可以用暴力+哈希来实现。

创建哈希表,并建立每个字符串与其下标的映射关系;

然后找是否存在key值(字符串s),存在则返回哈希表中的value值;

否则说明不存在该字符串,返回-1。

Code:

cpp 复制代码
class Solution {
public:
    int findString(vector<string>& words, string s) {
        unordered_map<string,int> map;//创建哈希表
        //建立每个单词与其下标的映射关系
        for(int i=0;i<words.size();i++)
        {
            map[words[i]]=i;
        }
        //直接找字符串
        //找到了,直接返回value值
        if(map.find(s)!=map.end())
        {
             return map[s];
        }
        //没找到,返回-1
        return -1;
    }
};

再升级一下,采用二分法来实现。

思路:

1.先将数组前后的空字符串清除

2.如果mid下标遇到空字符串,统一向右靠,当mid=right时,我们直接更新右边界到mid的位置

3.剩下接着按照常规的二分查找法进行目标字符串的查找

Code:

cpp 复制代码
class Solution {
public:
    int findString(vector<string>& words, string s) {
        int left = 0, right = words.size() - 1;
		while (left <= right) {
            //左边界遇到空字符串,左边界向右移
			if (words[left].size() == 0) {
				left++;
				continue;
			}
            //右边界遇到空字符串,右边界向左移
			if (words[right].size() == 0) {
				right--;
				continue;
			}
            //中间下标mid
			int mid = (right + left) / 2;
            //如果遇到空字符串,统一向右靠
			while (words[mid].size() == 0) {
				mid++;
                //如果此时mid已经到达右边界,那么将右边界更新到中间下标mid处
                //这里right下标处的值会在后面判断到,不会被漏掉
				if (mid == right) {
					right = (right + left) / 2;
					continue;
				}
			}
            //这里顺便将刚刚上一步的右边界的值判断了,并没有漏掉
			//剩下的就是二分法常规查找
			if (words[mid] == s)
				return mid;
			else if (words[mid] > s) {
				right = mid - 1;
			}
			else {
				left = mid + 1;
			}
		}
		return -1;

    }
};
相关推荐
hanlin03几秒前
刷题笔记:力扣第242、349题(哈希表)
笔记·算法·leetcode
aramae31 分钟前
C++ IO流完全指南:从C标准库到C++流式编程
服务器·c语言·开发语言·c++·后端
_wyt0011 小时前
c++里的族谱:树
c++·
@三十一Y2 小时前
C++:AVL树实现
c++
haolin123.2 小时前
类和对象(上)
开发语言·c++
ShineWinsu2 小时前
对于Linux:传输层协议UDP原理的解析
linux·c++·面试·udp·协议·传输层·计算机系统
LingzhiPi2 小时前
零知派ESP32--AS5600磁吸旋钮音量控制器
c++·单片机·嵌入式硬件
小保CPP3 小时前
OpenCV C++车型识别1-图像预处理
c++·人工智能·opencv·计算机视觉
库克克3 小时前
【C++】C++11 包装器function 与 绑定器 bind
开发语言·c++
小小龙学IT3 小时前
C++ Placement New 与显式析构:手动对象生命周期管理的艺术
c++·windows·mfc