这题还是一个二分答案,对k进行二分查找,当k1符合题意时,比k1小的k也符合,具有单调性,所以可以用二分来查找符合题意的最大k。这题难点就在于对字符串的处理和判断字串,我这边是用了两个字符串来实现的。
class Solution {
public:
int maximumRemovals(string s, string p1, vector<int>& removable) {
int p=0,q=removable.size(),k=0;
while(p<=q){
string s1,s2="";
int qp=0;
int mid=p+(q-p)/2;
s1=s;
for(int i=0;i<mid;i++){
s1[removable[i]]='X';
}
for(int i=0;i<s1.size();i++){
if(s1[i]!='X'){
s2+=s1[i];
if(qp<p1.size()&&s1[i]==p1[qp]){
qp++;
}
}
}
if(qp==p1.size()){
k=mid;
p=mid+1;
}
else{
q=mid-1;
}
}
return k;
}
};
对速度进行二分搜索
class Solution {
public:
int minSpeedOnTime(vector<int>& dist, double hour) {
if(hour<=dist.size()-1){
return -1;
}
int ans;
int p=1,q=10000000;
while(p<=q){
double time=0;
int mid=p+(q-p)/2;
int i;
for(i=0;i<dist.size()-1;i++){
if(dist[i]<=mid){
time+=1;
}
else{
time+=dist[i]/mid;
if(dist[i]%mid){
time++;
}
}
if(time>=hour){
break;
}
}
time+=(double)dist[i]/mid;
if(time<=hour){
q=mid-1;
ans=mid;
}
else{
p=mid+1;
}
}
return ans;
}
};