java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 |
---|
文章目录
位运算
解题思路:时间复杂度O(
L
∗
n
2
L * n^2
L∗n2),L是words中所有单词长度之和,n是单词个数。空间复杂度O(
n
n
n) |
---|
代码:官方增加了测试用例,目前最快是16ms,这里优化了一些步骤,达到了8ms。但是依然无法超过2022年时候测试用例少的时候提交的效率。 |
---|
class Solution {
public int maxProduct(String[] words) {
int n = words.length;
int[] temp = new int[n];
for(int i = 0; i < n; i++){
int binary = 0;
for(int j = 0; j < words[i].length(); j++){
int num = words[i].charAt(j) - 'a';
binary |= (1 << num);
}
temp[i] = binary;
}
int result = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < i; j++){
if((temp[i] & temp[j]) == 0){
result = Math.max(result,words[i].length() * words[j].length());
}
}
}
return result;
}
}
优化思路
class Solution {
public int maxProduct(String[] words) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int length = words.length;
for (int i = 0; i < length; i++) {
int mask = 0;
String word = words[i];
int wordLength = word.length();
for (int j = 0; j < wordLength; j++) {
mask |= 1 << (word.charAt(j) - 'a');
}
if (wordLength > map.getOrDefault(mask, 0)) {
map.put(mask, wordLength);
}
}
int maxProd = 0;
Set<Integer> maskSet = map.keySet();
for (int mask1 : maskSet) {
int wordLength1 = map.get(mask1);
for (int mask2 : maskSet) {
if ((mask1 & mask2) == 0) {
int wordLength2 = map.get(mask2);
maxProd = Math.max(maxProd, wordLength1 * wordLength2);
}
}
}
return maxProd;
}
}