我的二分法插入代码如下↓
class Solution:
def vowelStrings(self, words: List[str], queries: List[List[int]]) -> List[int]:
vowels_word_indexes=[]
ans_list=[]
for i in range(len(words)):
if self.Judge(words[i]):
vowels_word_indexes.append(i)
else:
pass
if len(vowels_word_indexes)==0:
return [0]*len(queries)
for start,end in queries:
start_index,end_index=self.CountNumber(vowels_word_indexes,start,end)
ans_list.append(end_index-start_index+1)
return ans_list
def Judge(self,word):
vowels=['a','e','i','o','u']
if word[0] in vowels and word[-1] in vowels:
return True
else:
return False
def CountNumber(self,vowels_word_indexes,start,end):
start_flag=0
end_flag=0
l=len(vowels_word_indexes)
# start_index
if start<=vowels_word_indexes[0]:
start_index=0
else:
left=0
right=l-1
while left<=right:
mid=floor((left+right)/2)
if vowels_word_indexes[mid]==start:
start_index=mid
start_flag=1
break
elif vowels_word_indexes[mid]<start:
left=mid+1
else:
right=mid-1
if start_flag==0:
start_index=max(left,mid,right)
# end_index
if end>=vowels_word_indexes[-1]:
end_index=l-1
else:
left=0
right=l-1
while left<=right:
mid=floor((left+right)/2)
if vowels_word_indexes[mid]==end:
end_index=mid
end_flag=1
break
elif vowels_word_indexes[mid]<end:
left=mid+1
else:
right=mid-1
if end_flag==0:
end_index=min(left,mid,right)
return start_index,end_index
官方题解:前缀和
class Solution:
def vowelStrings(self, words: List[str], queries: List[List[int]]) -> List[int]:
def isVowelString(word):
return isVowelLetter(word[0]) and isVowelLetter(word[-1])
def isVowelLetter(c):
return c == 'a' or c == 'e' or c == 'i' or c == 'o' or c == 'u'
n = len(words)
prefix_sums = [0] * (n + 1)
for i in range(n):
value = 1 if isVowelString(words[i]) else 0
prefix_sums[i + 1] = prefix_sums[i] + value
ans = []
for i in range(len(queries)):
start, end = queries[i]
ans.append(prefix_sums[end + 1] - prefix_sums[start])
return ans