题目:
定义一个函数 f(s)
,统计s
中**(按字典序比较)最小字母的出现频次** ,其中s
是一个非空字符串。
例如,若 s = "dcce"
,那么 f(s) = 2
,因为字典序最小字母是 "c"
,它出现了 2 次。
现在,给你两个字符串数组待查表 queries
和词汇表 words
。对于每次查询 queries[i]
,需统计 words
中满足 f(queries[i])
< f(W)
的词的数目 ,W
表示词汇表 words
中的每个词。
请你返回一个整数数组 answer
作为答案,其中每个 answer[i]
是第 i
次查询的结果。
思路:转化成二分查找问题,闭区间 > 问题。
代码:
java
class Solution {
public int[] numSmallerByFrequency(String[] queries, String[] words) {
int n = words.length;
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = func(words[i]);
}
Arrays.sort(nums);
int m = queries.length;
int[] ans = new int[m];
for (int j = 0; j < m; j++) {
int target = func(queries[j]);
int start = lowerBound(nums, target + 1);
ans[j] = n - start;
}
return ans;
}
private int lowerBound(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
private int func(String s) {
int[] cnt = new int[26];
for (int i = 0; i < s.length(); i++) {
cnt[s.charAt(i) - 'a']++;
}
for (int c : cnt) {
if (c > 0) {
return c;
}
}
return 0;
}
}
性能:
时间复杂度o( (m+n)logn )
空间复杂度o(m + n)