用最少数量的箭引爆气球
思路
如果当前数组的左区间没有覆盖前一个数组的右区间,就需要新的箭来击穿。不然就更新新的右区间。
class Solution {
static bool cmd(const vector<int>&a,vector<int>&b){
if(a[0]==b[0]){ return a[1]<b[1];
}
return a[0]<b[0];
}
public:
int findMinArrowShots(vector<vector<int>>& points) {
if(points.size()<=1){return points.size();}
sort(points.begin(),points.end(),cmd);
int result=1;
for(int i =1;i<points.size();i++){
if(points[i][0]>points[i-1][1]){
result++;
}
else points[i][1]=min(points[i][1],points[i-1][1]);
}
return result;
}
};
不重叠区间
给出一个集合序列,移除某些序列,使得剩余区间不重叠。
一开始,思路是如果后一个序列的左边界小于前一个序列的右边界,那么就计数,然后删除该序列。
产生的问题是我在遍历的过程中删除元素,会导致数组越界。
题解的思路是记录不重叠的元素序列,重叠的是总数减去不重叠,这样做的好处是避免了在遍历过程中改变数组的大小。具体思路是:如果当前数组的左边界大于前一个数组(即尾数组)的右边界,就进行计数,并且更新尾数组。
划分字母区间
记录第一个下标的字母,找到重复的作为一个节点,如果下一个和前面的不同,说明找到了第一个分割点。
题解
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[27]={0};
for(int i=0;i<s.size();i++){
hash[s[i]-'a'] =i;
}
int left=0;
int right=0;
vector<int> result;
for(int i=0;i<s.size();i++){
right=max(right,hash[s[i]-'a']);
if(i==right){
result.push_back(right-left+1);
left=i+1;
}
}
return result;
}
};
哈希表里面存放的是什么:

哈希表存放字母出现的最大下标
hash[0] 存放字母a出现的最大下标;
浙公网安备 33010602011771号