20210314:力扣第 232 场周赛

题目

  1. 仅执行一次字符串交换能否使两个字符串相等
    在这里插入图片描述

  2. 找出星型图的中心节点
    在这里插入图片描述

  3. 最大平均通过率
    在这里插入图片描述

  4. 好子数组的最大分数
    在这里插入图片描述

思路与算法

  1. 仅执行一次字符串交换能否使两个字符串相等
    翻译题目即可
  2. 找出星型图的中心节点
    关键在于清楚这个中心点出现的次数刚好就是点数-1
  3. 最大平均通过率
    优先队列存所有的最大通过率,注意加一个同学到一个班里的通过率提升最大,再加就会减少通过率,因此每次只能加1个,按顺序一个一个加才行。
  4. 好子数组的最大分数
    贪心,尽可能宽的范围,尽可能大的最小值。最小值包含k,依次减小遍历即可。

代码实现

  1. 仅执行一次字符串交换能否使两个字符串相等
class Solution {
public:
    bool areAlmostEqual(string s1, string s2) {
        if (s1.size() != s2.size()) {
            return false;
        }
        if (s1 == s2) {
            return true;
        }
        for (int i = 0; i < s1.size() - 1; ++i) {
            for (int j = i + 1; j < s1.size(); ++j) {
                if (swap(s1,i,j) == s2) {
                    return true;
                }
            }
        }
        return false;
    }
public:
    string swap (string s,int a,int b) {
        char tmp = s[b];
        s[b] = s[a];
        s[a] = tmp;
        return s;
    }
};
  1. 找出星型图的中心节点
class Solution {
public:
    int findCenter(vector<vector<int>>& edges) {
        // 中心点出现的次数就是二维数组的行数,每一行都有一个中心点
        // 注意下面这个target == 点数n - 1,
        int target = edges.size();
        int res = 0;
        vector<int> cnt(target + 2,0);
        for (auto edge : edges) {
            ++cnt[edge[0]];
            ++cnt[edge[1]];
        }

        // 索引范围为1 - target+2,因此直接遍历cnt,找到那个等于行数的索引输出即可。
        for (int i = 1; i < target + 2; ++i) {
            if (cnt[i] == target) {
                return i;
            }
        }
        return -1;
    }
};
  1. 最大平均通过率
class Solution {
public:
    double maxAverageRatio(vector<vector<int>>& classes, int extraStudents) {

        // 优先队列pq
        priority_queue<pair<double, int>> h;
        // 将加入一个好学生增加的通过率提升值和对应的插入的班级索引放入pq        
        for (int i = 0; i < classes.size(); ++i)
            h.push( pair((classes[i][0] + 1) / (classes[i][1] + 1.0) - classes[i][0] / (double)classes[i][1], i ) );
        // 每次插班一个好学生,一个一个按照通过率提升来排序再插入进去,最后得到最大结果
        while (extraStudents--) {
            // 最大提升的二元组保存
            pair<double, int> cur = h.top();
            // 将其出队
            h.pop();

            // 对应的班级人数和通过人数都增加1
            ++classes[cur.second][0];
            ++classes[cur.second][1];
            // 再加入一个通过率提升进去。
            h.push({(classes[cur.second][0] + 1) / (classes[cur.second][1] + 1.0) - classes[cur.second][0] / (double)classes[cur.second][1], cur.second});
        }
        // 计算结果并输出
        double ans = 0;
        for (auto i : classes) ans += i[0] / (double)i[1];
        return ans / classes.size();
    }
};
  1. 好子数组的最大分数
class Solution {
public:
    int maximumScore(vector<int>& nums, int k) {
        // 暴力遍历即可
        int left = k, right = k;
        int ans = 0;
        // 从nums[k]开始遍历
        for (int i = nums[k]; i >= 1; i--) {
            // 左右开始移动贪心
            while (left > 0 && nums[left - 1] >= i) {
                left--;
            }
            while (right < (nums.size() - 1) && nums[right + 1] >= i) {
                right++;
            }
            // 更新最大值
            ans = max(ans,(right - left + 1) * i);
        }
        return ans;
    }
};

写在最后

  1. 合理安排时间宝贝
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值