稀疏矩阵搜索(两种方法解决: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;

    }
};
相关推荐
在路上看风景8 分钟前
1.8 分块矩阵
线性代数·矩阵
CoovallyAIHub10 分钟前
终结AI偏见!Sony AI发布Nature论文与FHIBE数据集,重塑公平性评估基准
深度学习·算法·计算机视觉
ChoSeitaku11 分钟前
线代强化NO3|线性方程组|特征值和特征向量|矩阵的相似性|实对称矩阵|二次型
线性代数·矩阵
7澄112 分钟前
深入解析 LeetCode 1572:矩阵对角线元素的和 —— 从问题本质到高效实现
java·算法·leetcode·矩阵·intellij-idea
ALex_zry15 分钟前
c20 字符串处理优化可选方案
算法
阳光明媚sunny17 分钟前
分糖果算法题
java·算法
卡提西亚20 分钟前
一本通网站1125题:矩阵乘法
c++·算法·矩阵·编程题·一本通
程序员东岸22 分钟前
数据结构精讲:从栈的定义到链式实现,再到LeetCode实战
c语言·数据结构·leetcode
laocooon5238578861 小时前
大数的阶乘 C语言
java·数据结构·算法
Boop_wu1 小时前
[Java EE] 多线程 -- 初阶(1)
java·jvm·算法