小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动
本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
5.引爆气球
问题:
解法: 和之前的去除重叠区间类似。要想引爆气球,需要每次的区间有重叠,首先引爆的是区间长度最小的那个,其余的区间和它有交集就可以跳过。不断重复。那么怎么去排序呢? !! 按照末尾值最小排序。
class Solution {
public:
static bool compare(vector<int> &a,vector<int>&b)
{
if(a[1]<b[1]) return true;
return false;
}
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(),points.end(),compare);
for(int i=0;i<points.size();i++)
{
cout<<points[i][0]<<points[i][1]<<endl;
}
int count=0;
if(points.empty()) return count;
int pre_start =points[0][0];
int pre_end =points[0][1];
count++;
for(int i=1;i<points.size();i++)
{
if(points[i][0]>pre_end)
{
pre_start=points[i][0];
pre_end =points[i][1];
count++;
}else{
pre_start=points[i][0];
}
}
for(int i=1;i<points.size();i++)
{
if(points[i][0]>pre_end)
{
pre_start=points[i][0];
pre_end =points[i][1];
count++;
}else{
pre_start=points[i][0];
}
}
return count;
}
};
6.划分字母空间
问题:
同一个字母最多出现在一个片段里。 解法:双指针+贪心算法。每次字段的长度必须要等于当前出现的字母最后出现的位置。因此先统计每个字母出现的最后位置。用2个指针表示开始和结束。当结束的位置满足所有字母都已经出现(字母出现的最后位置),成功。 复杂度是N的。因为返回的是所有的长度,所以必须也要有start指针。
class Solution {
public:
vector<int> partitionLabels(string S) {
unordered_map<char,int>count;
vector<int>last(26,0);
vector<int>result;
for(int i=0;i<S.size();i++)
{
char c=S[i];
last[c-'a']=i;
}
int start=0;
int end=0;
for(int i=0;i<S.size();i++)
{
char c=S[i];
end =max(end,last[c-'a']);
if(end==i)
{
result.push_back(end-start+1);
start=end+1;
}
}
return result;
}
};
7.买股票 问题:
解法:简单的股票题。尽可能多的交易。全局的profit表示当前利润,遍历一遍的时候如果满足交易情况,就直接的去算利润。不满足就设置当前最小值。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit=0;
if(prices.empty()||prices.size()==1) return 0;
for(int i=1;i<prices.size();i++)
{
profit=profit+((prices[i]-prices[i-1])>0?(prices[i]-prices[i-1]):0);
cout<<profit<<endl;
}
return profit;
}
};