稀疏数组搜索
难度:
标签:
题目描述
Given a sorted array of strings that is interspersed with empty strings, write a method to find the location of a given string.
Example1:
Input: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta" Output: -1 Explanation: Return -1 ifs
is not inwords
.
Example2:
Input: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ball" Output: 4
Note:
1 <= words.length <= 1000000
代码结果
运行时间: 21 ms, 内存: 16.3 MB
/*
* 稀疏数组搜索
* 题目思路:
* 使用Java Stream对数组进行处理,过滤掉空字符串,
* 然后查找目标字符串的位置。
*/
import java.util.*;
import java.util.stream.*;
public class SparseArraySearchStream {
public int findString(String[] words, String s) {
List<String> wordList = Arrays.stream(words)
.filter(word -> !word.isEmpty())
.collect(Collectors.toList());
return wordList.indexOf(s);
}
}
解释
方法:
这个题解采用了一个二分查找的变体来处理含有空字符串的排序字符串数组。算法的核心是在常规的二分查找基础上加入了对空字符串的处理。在查找中值mid时,如果发现words[mid]是空字符串,则向右移动mid,直到找到非空字符串或者到达数组的右界。如果整个区间mid到right都是空字符串,那么调整搜索的右界限为mid左边的位置;如果找到了非空字符串,则比较这个字符串和目标字符串s。如果相等,则返回mid的位置;如果目标字符串小,则左移右界;反之,则右移左界。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在稀疏数组中进行二分查找时,为什么选择先向右移动mid以跳过空字符串,而不是选择向左移动?
▷🦆
二分查找中,如果右侧全是空字符串导致调整右界至mid左边的位置,这种情况下如何保证不会错过目标字符串s的正确位置?
▷🦆
在数组两端存在大量空字符串的情况下,这种算法的效率如何影响,是否有更优的处理策略?
▷