文章目录
- 前言
- 使每位学生都有座位的最少移动次数
- 分发饼干
- 运动员和训练师的最大匹配数
- 检查一个字符串是否可以打破另一个字符串
- 优势洗牌
前言
💫你好,我是辰chen,本文旨在准备考研复试或就业
💫文章题目大多来自于 leetcode,当然也可能来自洛谷或其他刷题平台
💫欢迎大家的关注,我的博客主要关注于考研408以及AIoT的内容
🌟 仅给出C++版代码
以下的几个专栏是本人比较满意的专栏(大部分专栏仍在持续更新),欢迎大家的关注:
💥ACM-ICPC算法汇总【基础篇】
💥ACM-ICPC算法汇总【提高篇】
💥AIoT(人工智能+物联网)
💥考研
💥CSP认证考试历年题解
使每位学生都有座位的最少移动次数
题目链接:使每位学生都有座位的最少移动次数
C++版AC代码:
class Solution {
public:int minMovesToSeat(vector<int>& seats, vector<int>& students) {sort(seats.begin(), seats.end());sort(students.begin(), students.end());int res = 0;for (int i = 0; i < seats.size(); ++ i ) res += abs(seats[i] - students[i]);return res;}
};
分发饼干
题目链接:分发饼干
C++版AC代码:
class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int res = 0;for (int i = 0, j = 0; i < g.size() && j < s.size(); ++ i ) {while (j < s.size() && g[i] > s[j]) ++ j;if (j != s.size()) res ++;++ j;}return res;}
};
运动员和训练师的最大匹配数
题目链接:运动员和训练师的最大匹配数
C++版AC代码:
class Solution {
public:int matchPlayersAndTrainers(vector<int>& players, vector<int>& trainers) {sort(players.begin(), players.end());sort(trainers.begin(), trainers.end());int res = 0;for (int i = 0, j = 0; i < players.size() && j < trainers.size(); ++ i, ++ j ) {while (j < trainers.size() && players[i] > trainers[j]) ++ j;if (j != trainers.size()) res ++;}return res;}
};
检查一个字符串是否可以打破另一个字符串
题目链接:检查一个字符串是否可以打破另一个字符串
C++版AC代码:
class Solution {
public:bool checkIfCanBreak(string s1, string s2) {sort(s1.begin(), s1.end());sort(s2.begin(), s2.end());int i = 0;while (i < s1.size() && s1[i] == s2[i]) ++ i; // 确定出谁打破谁bool brk = s1[i] >= s2[i];for (; i < s1.size(); ++ i ) {if (s1[i] == s2[i]) continue; // 同样的时候不比较bool flag = s1[i] >= s2[i];if (flag != brk) return false;}return true;}
};
优势洗牌
题目链接:优势洗牌
C++版AC代码:
class Solution {
public:vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());vector<int> idx(nums2.size());iota(idx.begin(), idx.end(), 0); // 将 idx 填充为从 0 开始的连续整数序列/* idx中存储的是nums2从小排到大的索引比如 nums2 = [13, 25, 32, 11]从小到大排列后 nums2 = [11, 13, 25, 32]此时idx = [3, 0, 1, 2]*/sort(idx.begin(), idx.end(), [&](int i, int j) {return nums2[i] < nums2[j]; });vector<int> res(nums1.size());int i = 0, j = idx.size() - 1;for (auto x : nums1) {if (x > nums2[idx[i]]) {res[idx[i]] = x;i ++;}else {res[idx[j]] = x;j --;}}return res;}
};