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

大型门户网站wordpress媒体主题

大型门户网站,wordpress媒体主题,旅行网站建设,站长之家是什么网站leetcode学习算法之贪心算法: 452.用最少数量的箭引爆气球 763.划分字母区间 452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和…

leetcode学习算法之贪心算法:

452.用最少数量的箭引爆气球
763.划分字母区间

452. 用最少数量的箭引爆气球
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。
一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。
给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。

示例 :
输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
-在x = 6处射出箭,击破气球[2,8]和[1,6]。
-在x = 11处发射箭,击破气球[10,16]和[7,12]。

代码

class Solution {
public:int findMinArrowShots(vector<vector<int>>& points) {//计算合并后的区间有多少个,先进行排序sort(points.begin(), points.end(), [](vector<int>& a, vector<int>& b) {return a[1] < b[1]; });int n = points.size(), pre_end = points[0][1];for (int i = 1; i < points.size(); i++){if (points[i][0] <= pre_end){n--;}else pre_end = points[i][1];}return n;}
};

调用测试

int main() {int n;cout << "请输入区间的数量: ";cin >> n;  // 输入区间个数vector<vector<int>> intervals;  // 用于存储所有区间cout << "请依次输入每个区间的起始和结束位置(格式:start end):" << endl;for (int i = 0; i < n; i++) {int start, end;cin >> start >> end;  // 输入每个区间的两个数intervals.push_back({ start, end });  // 直接构造 vector<int> 并加入}Solution solution;int result = solution.findMinArrowShots(intervals);printf("%d", result);return 0;
}

这一题参考作者书里题435.无重叠区间的思想进行解题。
贪心策略是:按照右端点从小到大排序,每次判断当前区间与前一个区间是否重叠,有重叠则减少射出剑的数量。

763. 划分字母区间
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 “ababcc” 能够被分为 [“abab”, “cc”],但类似 [“aba”, “bcc”] 或 [“ab”, “ab”, “cc”] 的划分是非法的。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。
返回一个表示每个字符串片段的长度的列表。

示例 :
输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”、“defegde”、“hijhklij” 。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。

代码

class Solution {
public:vector<int> partitionLabels(string s) {// 步骤1:记录每个字符的首尾位置vector<vector<int>> intervals;int first[26], last[26];// 初始化为 -1for (int i = 0; i < 26; i++) {first[i] = last[i] = -1;}// 遍历字符串,记录每个字符的首尾位置for (int i = 0; i < s.size(); i++) {int idx = s[i] - 'a';if (first[idx] == -1) {first[idx] = i;}last[idx] = i;}// 收集存在的字符区间for (int i = 0; i < 26; i++) {if (first[i] != -1) {intervals.push_back({ first[i], last[i] });}}// 步骤2:按起始位置排序sort(intervals.begin(), intervals.end());// 步骤3:合并区间vector<vector<int>> merged;for (auto& interval : intervals) {if (merged.empty() || merged.back()[1] < interval[0]) {merged.push_back(interval);  // 不重叠,新开区间}else {merged.back()[1] = max(merged.back()[1], interval[1]);  // 重叠,合并}}// 步骤4:计算每个区间的长度vector<int> result;for (auto& m : merged) {result.push_back(m[1] - m[0] + 1);}return result;}
};

调用测试

int main() {string s;cout << "请输入字符串: ";cin >> s;Solution solution;vector<int> result = solution.partitionLabels(s);cout << "每个分区的长度: ";for (int len : result) {cout << len << " ";}cout << endl;return 0;
}

贪心策略思想步骤:讲题目抽象成区间的问题,思想类似于区间的重叠。
1.首先获取每个字母的首尾位置
2.获取每个字母所在的区间
3.合并区间
4.计算每个区间的长度

题目还得多练,大部分题目可以抽象成一类题目的模板,接下来我要每天更新,冲。

http://www.dtcms.com/a/408666.html

相关文章:

  • 自己编写代码建设微网站义乌网络营销
  • 怎么创立自己的网站广州新公司网站建设
  • 可商用的免费素材网站wordpress 数据库导入数据库文件
  • 网站图解图片是用什么软件做的软件外包价格一般多少
  • 个人做商机网站如何盈利专业手机网站建设推荐
  • 怎么做无损mp3下载网站网址大全2345qiren
  • 网站文章优化怎么做网站推广意识薄弱
  • 高校图书馆网站的建设方案做美食软件视频网站有哪些
  • 制作微信网站模板php网站开发最新需求
  • 湖北省平安建设网站建设网站需要做的工作
  • 申请好域名后 怎么做网站大学网站建设论文
  • 青岛网站制作工具设计wordpress页面模板下载
  • 沈阳网站建设服务平台枣庄手机网站开发公司
  • 工信部 网站备案材料 复印件 电子版搭建网站手机软件
  • 网站策划怎么样开源网站系统安全性
  • 好看的创意网站设计免费商用WordPress主题
  • iis搭建本地网站做静态网站接单
  • h5做网站用什么框架如何做某网站的移动客户端开发
  • 宿迁商城网站建设做国外lead应该做什么网站
  • 做360手机网站优化做定制网站多少钱
  • 厦门做网站需要多少钱企业网站建设找智恒网络
  • 佛山本地的网站设计公司惠州企业网站建设选哪家
  • 营销型网站建设优化建站常州网站备案
  • 官网建设建站网站和软件有什么区别
  • 河间做网站 申梦网络科技成果鉴定机构
  • 免费网站推广网站破解版建站工作室网站源码
  • 如何用域名做邮箱 网站电话营销网站推广
  • 淮安做网站智能行业网站模板
  • 网站首页图片怎么更换wordpress 文章推荐一篇文章
  • 对网站做数据统计的目的是什么意思seo技术培训课程