Leetcode 双周赛 42 题解

5621. 无法吃午餐的学生数量

思维

判断栈中那种三明治比所需人多,找多出来的位置以后便是不可取的

class Solution {
public:
    int countStudents(vector<int>& students, vector<int>& sandwiches) {
            int n = students.size();
        int numa = 0,numb = 0;
        int suma = 0,sumb = 0;
        for(int i = 0 ; i < n; i ++) {
            if(students[i] == 0) numa ++;
            else numb ++;
        }
        for(int j = 0;j < n ; j ++){
            if(sandwiches[j] == 0) suma ++;
            else sumb ++;
        }
        int sum = 0;
        if(numa == suma) return 0;
        else{
            int y;
            if(numa < suma){
                int x = numa;
                for(int i = 0;i < n ; i ++){
                    if(sandwiches[i] == 0) x --;
                    if(x == 0) y = i;
                }
            }else{
                int x = numb;
                for(int i = 0;i < n ; i ++){
                    if(sandwiches[i] == 1) x --;
                    if(x == 0) y = i;
                }
            }
            sum = n - 1 - y;
        }
        return sum;
    }
};

5622. 平均等待时间

模拟

class Solution {
public:
    double wait[100000 + 10];
    double averageWaitingTime(vector<vector<int>>& c) {
        int sum = 0;
        int n = c.size();
        sum = c[0][0];
        for(int i = 0 ; i < n ;  i++){
            if(sum >= c[i][0]){
            sum += c[i][1];
            wait[i] = sum - c[i][0];
            }else{
                sum = c[i][0] + c[i][1];
                wait[i] = sum - c[i][0];
            }
           // cout << wait[i] << endl;
        }
        double num = 0;
        for(int i = 0 ; i < n ; i ++){
            num += wait[i];
        }
        double m = double(n);
        return num / m;
    }
};

5623. 修改后的最大二进制字符串

思维+构造

最前面的1不变,后面的01串都会变成111101111的形式

前面的00 都会变成 10,后面的数多的都可以转换成01111的形式,前后结合形成11110111

class Solution {
public:
    string maximumBinaryString(string str) {
        int k = 0;
        while (k < str.size() && str[k] != '0') k ++ ;//前面1的个数不会发生改变
        if (k == str.size()) return str;
        int cnt = 0;
        for (auto c: str)
            if (c == '0')
                cnt ++ ;
        k += cnt - 1;//后面的0字符串会转成111110形式
        return string(k, '1') + '0' + string((int)str.size() - k - 1, '1');//剩下的为1
    }
};

5624. 得到连续 K 个 1 的最少相邻交换次数

class Solution {
public:
    int minMoves(vector<int>& nums, int k) {
        if (k == 1) {
            return 0;
        }
        
        vector<int> sum = {0};
        vector<int> v;
        int n = nums.size();
        int count = 0;
        for (int i = 0; i < n; ++i) {
            if (nums[i] == 1) {
                v.push_back(i - count);
                sum.push_back(sum.back() + v.back());
                ++count;
            }
        }

        int ans = INT_MAX;
        int m = v.size();
        for (int i = 0; i + k <= m; ++i) {
            int mid = (i + i + k - 1) / 2;
            ans = min(ans, v[mid] * (mid - i) - (sum[mid] - sum[i]) + (sum[i + k] - sum[mid + 1]) - v[mid] * (i + k - 1 - mid));
        }
        
        return ans;
    }
};
原文地址:https://www.cnblogs.com/DWVictor/p/14195044.html