leetcode周赛补完计划(六)

周赛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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值