题目
一个数组中只有两种字符’G’和’B’,可以让所有G都放在左侧,所有B都放在右侧 或者让所有G都放在右侧,所有B都放在左侧,但只能在相邻字符之间进行交换操作,返回至少需要交换几次?
方法思路
-
问题分析:数组仅包含字符 ‘G’ 和 ‘B’。允许的操作是交换相邻字符。目标有两种:一是所有 ‘G’ 在左,所有 ‘B’ 在右;二是所有 ‘B’ 在左,所有 ‘G’ 在右。
-
关键观察:对于第一种目标(所有 ‘G’ 在左),最小交换次数等于每个 ‘G’ 左边所有 ‘B’ 的数量之和。对于第二种目标(所有 ‘B’ 在左),最小交换次数等于每个 ‘B’ 左边所有 ‘G’ 的数量之和。
-
算法选择:通过两次遍历数组,分别计算两种目标的交换次数。第一次遍历计算所有 ‘G’ 在左的交换次数,第二次遍历计算所有 ‘B’ 在左的交换次数。最终结果为这两种情况的最小值。
-
复杂度分析:算法的时间复杂度为 O(n),其中 n 是数组的长度,因为我们需要遍历数组两次。空间复杂度为 O(1),仅使用常数级别的额外空间。
代码实现
public static int minSwaps(char[] arr){
if(arr == null || arr.length == 0){
return 0;
}
int leftG = 0;
int countG = 0;
//G左移
for(int right = 0; right < arr.length; right++){
if(arr[right] == 'G'){
countG += right - leftG;
leftG ++;
}
}
int leftB = 0;
int countB = 0;
//B左移
for(int right = 0; right < arr.length; right++){
if(arr[right] == 'B'){
countB += right - leftB;
leftB ++;
}
}
return Math.min(countG,countB);
}

被折叠的 条评论
为什么被折叠?



