2024-5-11
题目来源
我的题解
方法一 前缀和+预计算
使用前缀和计算从0到任何位置的花费的时间;预计算每堆垃圾中,不同类别垃圾的数量
时间复杂度:O(n max(garbage))。总的垃圾堆数量*最大垃圾堆
空间复杂度:O(n)
public int garbageCollection(String[] garbage, int[] travel) {
int m_count=0;
int p_count=0;
int g_count=0;
int n=garbage.length;
int[] preSum=new int[n];
int[][] count=new int[n][3];
for(int i=0;i<travel.length;i++){
preSum[i+1]=preSum[i]+travel[i];
}
for(int i=0;i<n;i++){
for(char c:garbage[i].toCharArray()){
if(c=='M'){
count[i][0]++;
} else if (c=='P') {
count[i][1]++;
}else{
count[i][2]++;
}
}
}
int index=0;
int m_pre=0;
int p_pre=0;
int g_pre=0;
while(index<n){
if(garbage[index].contains("M")){
m_count+=count[index][0]+preSum[index]-preSum[m_pre];
m_pre=index;
}
if(garbage[index].contains("P")){
p_count+=count[index][1]+preSum[index]-preSum[p_pre];
p_pre=index;
}
if(garbage[index].contains("G")){
g_count+=count[index][2]+preSum[index]-preSum[g_pre];
g_pre=index;
}
index++;
}
return m_count+p_count+g_count;
}
//优化
public int garbageCollection(String[] garbage, int[] travel) {
int m_count=0;
int p_count=0;
int g_count=0;
int n=garbage.length;
int[] preSum=new int[n];
Map<Character,Integer> count=new HashMap<>();
for(int i=0;i<travel.length;i++){
preSum[i+1]=preSum[i]+travel[i];
}
int index=0;
int m_pre=0;
int p_pre=0;
int g_pre=0;
while(index<n){
for(char c:garbage[index].toCharArray()){
if(c=='M'){
m_count++;
} else if (c=='P') {
p_count++;
}else{
g_count++;
}
}
if(garbage[index].contains("M")){
m_count+=preSum[index]-preSum[m_pre];
m_pre=index;
}
if(garbage[index].contains("P")){
p_count+=preSum[index]-preSum[p_pre];
p_pre=index;
}
if(garbage[index].contains("G")){
g_count+=preSum[index]-preSum[g_pre];
g_pre=index;
}
index++;
}
return m_count+p_count+g_count;
}
//官方版本
public int garbageCollection(String[] garbage, int[] travel) {
Map<Character, Integer> distance = new HashMap<>();
int res = 0, curDis = 0;
for (int i = 0; i < garbage.length; i++) {
res += garbage[i].length();
if (i > 0) {
curDis += travel[i - 1];
}
for (char c : garbage[i].toCharArray()) {
distance.put(c, curDis);
}
}
return res + distance.values().stream().reduce(0, Integer::sum);
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~