周赛138
leetcode 1051. 高度检查器
解题思路:排序数组然后比对原始数组,顺手写个快速排序
public int heightChecker(int[] heights) {
int[] original = heights.clone();
qsort(heights,0,heights.length-1);
int num = 0;
for(int i = 0;i < heights.length;i++){
if(heights[i] != original[i])
num++;
}
return num;
}
public void qsort(int[] arr,int l,int r) {
if(l >= r)
return;
int mid = arr[l];
int left = l,right = r;
while (left < right){
while (left < right && arr[right] >= mid){
right--;
}
arr[left] = arr[right];
while (left < right && arr[left] <= mid){
left++;
}
arr[right] = arr[left];
}
arr[left] = mid;
qsort(arr,l,left-1);
qsort(arr,right+1,r);
}
leetcode 1052. 爱生气的书店老板
解题思路:滑动窗口,满足X分钟内不满意顾客的人数最多
public int maxSatisfied(int[] customers, int[] grumpy, int X) {
int sum = 0;
int max = 0;
for(int i = 0;i < customers.length;i++){
if(grumpy[i] == 0){
sum+=customers[i];
customers[i] = 0;
}
}
for(int i = 0;i < X;i++){
max+=customers[i];
}
int sumx = max;
for(int i = X;i < customers.length;i++){
sumx = sumx - customers[i-X] + customers[i];
max = Math.max(max,sumx);
}
return sum + max;
}
leetcode 1053. 交换一次的先前排列
解题思路:要求交换后的排列最大,因此从末尾出发,找到第一个不满足降序的位置i - 1,找到第一个比i - 1小的位置j,交换i-1和j的值
public int[] prevPermOpt1(int[] A) {
int j = A.length - 1;
for(int i = j;i >= 1;i--){
if(A[i] < A[i - 1]){
while (A[j] >= A[i - 1] || A[j] == A[j - 1])
j--;
int temp = A[j];
A[j] = A[i - 1];
A[i - 1] = temp;
break;
}
}
return A;
}
leetcode 1054. 距离相等的条形码
解题思路:对条形码分类,取数量最多的条形码填充奇数位置,每2个位置依次填充剩余条形码
public int[] rearrangeBarcodes(int[] barcodes) {
HashMap<Integer,Integer> count = new HashMap<>();
//countA保存所有的条形码和对应的数量,记录数量最多的条形码
int maxkey = barcodes[0],maxval = 1;
for(int i = 0;i < barcodes.length;i++){
if(count.containsKey(barcodes[i])){
count.replace(barcodes[i],count.get(barcodes[i]) + 1);
} else {
count.put(barcodes[i],1);
}
if(maxval < count.get(barcodes[i])) {
maxkey = barcodes[i];
maxval = count.get(barcodes[i];
}
}
//将数量最多的条形码填充到奇数位置
int index = 0;
while (count.containsKey(maxkey)){
barcodes[index] = maxkey;
index+=2;
maxval--;
if(maxval == 0)
count.remove(maxkey);
}
//依次填充剩余条形码
for(HashMap.Entry<Integer,Integer> i:count.entrySet()){
int val = i.getValue();
int key = i.getKey();
while (val > 0){
if(index >= barcodes.length)
index = 1;
barcodes[index] = key;
index+=2;
val--;
}
}
return barcodes;
}