当前位置: 首页 > news >正文

【C++刷题】优选算法——贪心第三辑

  1. 坏了的计算器
    在这里插入图片描述
int brokenCalc(int startValue, int target) {int step = 0;while (target > startValue) {if (target % 2 == 0) target /= 2;else target += 1;++step;}return step + startValue - target;
}
  1. 合并区间
    在这里插入图片描述
    区间问题,先排序
    vector<vector<int>> merge(vector<vector<int>>& intervals) {ranges::sort(intervals, [](vector<int>& left, vector<int>& right){return left[0] < right[0];});vector<vector<int>> ret;vector<int> tmp = intervals[0];for (int i = 1; i < intervals.size(); ++i) {if (intervals[i][0] <= tmp[1]) {tmp[1] = max(tmp[1], intervals[i][1]);} else {ret.push_back(tmp);tmp = intervals[i];}}ret.push_back(tmp);return ret;}
  1. 无重叠区间
    在这里插入图片描述
int eraseOverlapIntervals(vector<vector<int>>& intervals) {ranges::sort(intervals);int right = intervals[0][1], count = 0;for (int i = 1; i < intervals.size(); ++i) {if (intervals[i][0] < right) {if (intervals[i][1] < right) {right = intervals[i][1];}++count;} else {right = intervals[i][1];}}return count;
}
  1. 用最少数量的箭引爆气球
    在这里插入图片描述
int findMinArrowShots(vector<vector<int>>& points) {ranges::sort(points);int  right = points[0][1], count = 1;for (int i = 1; i < points.size(); ++i) {if (points[i][0] <= right) {right = min(right, points[i][1]);} else {++count;right = points[i][1];}}return count;
}
  1. 整数替换
    在这里插入图片描述
// 推荐解法一
class Solution {unordered_map<int, int> memo;
public:int integerReplacement(long long n) {if (memo.count(n)) return memo[n];if (n == 1) {memo[n] = 0;return memo[n];}if (n % 2 == 0) {memo[n] = integerReplacement(n / 2) + 1;return memo[n];} else {memo[n] = min(integerReplacement(n + 1), integerReplacement(n - 1)) + 1;return memo[n];}}
};// 解法二
/*
二进制知识:
偶数:二进制表示的最后一位为 0
奇数:二进制表示的最后一位为 1
除 2 操作:二进制表示统一右移一位
*/
class Solution {
public:int integerReplacement(long long n) {int count = 0;while (n != 1) {if (n % 2 == 0) {n /= 2;++count;} else {if (n == 3) {n = 1;count += 2;}else if (n % 4 == 1) {n -= 1;++count;} else {n += 1;++count;}}}return count;}
};
  1. 俄罗斯套娃信封问题
    在这里插入图片描述
class Solution {
public:int maxEnvelopes(vector<vector<int>>& envelopes) {ranges::sort(envelopes, [](vector<int>& left, vector<int>& right){return left[0] != right[0] ? left[0] < right[0] : left[1] > right[1];});vector<int> v = { envelopes[0][1] };int n = envelopes.size();for (int i = 1; i < n; ++i) {if (envelopes[i][1] < v.back()) {int left = 0, right = v.size() - 1;while (left < right) {int mid = left + (right - left) / 2;if (v[mid] < envelopes[i][1]) {left = mid + 1;} else {right = mid;}}v[left] = envelopes[i][1];} else if (envelopes[i][1] > v.back()) {v.push_back(envelopes[i][1]);}}return v.size();}
};
  1. 可被三整除的最大和
    在这里插入图片描述
class Solution {
public:int maxSumDivThree(vector<int>& nums) {int sum = 0;int min_1 = INT_MAX, sec_1 = INT_MAX, min_2 = INT_MAX, sec_2 = INT_MAX;for (int e : nums) {sum += e;if (e % 3 == 1) {if (e < min_1) {sec_1 = min_1;min_1 = e;} else if (e < sec_1) {sec_1 = e;}} else if (e % 3 == 2) {if (e < min_2) {sec_2 = min_2;min_2 = e;} else if (e < sec_2) {sec_2 = e;}}}if (sum % 3 == 0) {return sum;} else if (sum  % 3 == 1) {if (min_1 !=INT_MAX && sec_2 !=INT_MAX) {return max(sum - min_1, sum - min_2 - sec_2);} else if (min_1 !=INT_MAX) {return sum - min_1;} else {return sum - min_2 - sec_2;}} else {if (min_2 !=INT_MAX && sec_1 !=INT_MAX) {return max(sum - min_2, sum - min_1 - sec_1);} else if (min_2 !=INT_MAX) {return sum - min_2;} else {return sum - min_1 - sec_1;}}}
};
  1. 距离相等的条形码
    在这里插入图片描述
class Solution {
public:vector<int> rearrangeBarcodes(vector<int>& barcodes) {ranges::sort(barcodes);int num = barcodes[0], count = 1, left = 0, right = 1;while (right < barcodes.size()) {if (barcodes[right] == barcodes[left]) {++right;} else {if (right - left > count) {count = right - left;num = barcodes[left];}left = right;++right;}}if (right - left > count) {count = right - left;num = barcodes[left];}vector<int> ret(barcodes.size());int i = 0;while (count) {ret[i] = num;--count;i += 2;}for (int j = 0; j < barcodes.size(); ++j) {if (i >= ret.size()) i = 1;if (barcodes[j] != num) {ret[i] = barcodes[j];i += 2;}}return ret;}
};
  1. 重构字符串
    在这里插入图片描述
class Solution {
public:string reorganizeString(string s) {ranges::sort(s);char max_c = s[0];int count = 1, left = 0, right = 1;while (right < s.size()) {if (s[right] == s[left]) {++right;} else {if (right - left > count) {count = right - left;max_c = s[left];}left = right;++right;}}if (right - left > count) {count = right - left;max_c = s[left];}if (count > (s.size() + 1) / 2) return "";string ret = s;int i = 0;while (count) {ret[i] = max_c;--count;i += 2;}for (int j = 0; j < s.size(); ++j) {if (i >= ret.size()) i = 1;if (s[j] != max_c) {ret[i] = s[j];i += 2;}}return ret;}
};
http://www.lryc.cn/news/417098.html

相关文章:

  • 9.2 grafana 上导入模板看图并讲解告警
  • python实现自动回复消息
  • Mysql 脚本转换为drawio ER 脚本
  • 基于babylonjs的小游戏 跳一跳
  • 移动端下拉加载更多(h5,小程序)
  • Linux安全与高级应用(二)Linux Web服务器的安全配置与高级应用
  • 关于React.createContext全局注入的一些记录
  • 在S/4HANA OP 1511中激活嵌入式分析的基本配置
  • 好的提交 VS. 坏的提交 :Git 的最佳实践
  • MySQL第4讲--图像化界面工具DataGrip介绍
  • Curl工具小记
  • 【C#语音文字互转】C#语音转文字(方法一)
  • 基于Linux系统下的在线手机商城
  • Apache Kafka 事务详解
  • Go语言 结构体
  • 数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)
  • HTML5+CSS3-HTML5入门
  • 谷粒商城实战笔记-138-商城业务-首页-渲染二级三级分类数据
  • git的基础用法
  • 常见中间件漏洞(四、Apache合集)
  • HCIE-学习笔记
  • 【计算机网络】性能指标-带宽和时延(MB、GB、KB、B、byte、bit、Mb/s、Gb/s、b/s等)学习
  • ANN(Approximate Nearest Neighbor)搜索和索引库到底是什么?
  • 勒索软件、供应链攻击等带来的思考!
  • 【Nuxt】自定义插件和生命周期
  • MySQL的简单介绍
  • leetcode 116.填充每个节点的下一个右侧结点指针
  • 『 Linux 』网络基础
  • Python酷库之旅-第三方库Pandas(070)
  • 第一篇Linux介绍