二分答案,模板都差不多,就检验答案是否可行这片不一样
class Solution {
public:
int minDays(vector<int>& bloomDay, int m, int k) {
if(m*k>bloomDay.size()){
return -1;
}
int ans=0;
int p=2147483647,q=-1;
for(int i=0;i<bloomDay.size();i++){
p=min(p,bloomDay[i]);
q=max(q,bloomDay[i]);
}
while(p<=q){
int c=0,mid=p+(q-p)/2;
for(int i=0;i<bloomDay.size()-k+1;i++){
if(bloomDay[i]<=mid){
int flag=1;
int j=i;
for(j;j<i+k;j++){
if(bloomDay[j]>mid){
flag=0;
break;
}
}
if(flag){
c++;
}
i=j-1;
}
}
if(c>=m){
ans=mid;
q=mid-1;
}
else{
p=mid+1;
}
}
return ans;
}
};
这题本来是想贪心的,哪个绝对值最大就优化他,但是发现是错的nums1=[1,28,21],nums2=[9,21,20]时错了...
然后就考虑将nums1里每一个值换掉后对答案的贡献有多少,即能使答案减小多少。然后用答案减去这个最大贡献就行了
class Solution {
public:
int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
int k=1000000007;
int sum=0;
int n=nums1.size();
//先把答案算出来
for(int i=0;i<n;i++){
sum+=abs(nums1[i]-nums2[i]);
sum%=k;
}
//用nums3记录排序好的努nums1,方便等会用二分
vector<int> nums3=nums1;
sort(nums3.begin(),nums3.end());
//最大的贡献
int maxgx=0;
//对每个元素查找替换后的最大贡献
for(int i=0;i<n;i++){
int p=0,q=n-1;
int y=abs(nums1[i]-nums2[i]);
while(p<q){
int mid=p+(q-p)/2;
if(nums3[mid]>=nums2[i]){
q=mid;
}
else{
p=mid+1;
}
}
int x;
if(q==0){
x=abs(nums3[q]-nums2[i]);
}
else{
x=min(abs(nums3[q]-nums2[i]),abs(nums3[q-1]-nums2[i]));
}
if(maxgx>x-y){
maxgx=x-y;
}
}
sum+=maxgx;
sum%=k;
if(sum<0){
sum+=k;
}
return sum;
}
};