zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    dfs
    spring框架(3)— spring集合类的注入
    android入门 — Service
    android入门 — 多线程(一)
    android入门 — Activity启动模式
    android入门 — Activity生命周期
    android入门 — ProgressDialog/DatePickerDialog/TimePickerDialog
    Numpy入门
    Numpy入门
    Numpy入门
  • 原文地址:https://www.cnblogs.com/DWVictor/p/14195044.html
Copyright © 2011-2022 走看看