目录
前言
老师说做题要写题解,因为以后还会经常写各种地方的题,所以就集中在CSDN上写了,第一次写,有什么问题我会改QAQ,然后就是还是一个初学者其实不太懂“贪心算法”的严格证明,或是“单调栈”什么的,听灵神(灵茶山艾府)讲解其实也只是一知半解,所以就是随便写写而已。
8048.最大二进制奇数
题目描述:
分析:
这道题没有什么难的,题目要求首先是奇数,那么就把字符串里面的一个1和末尾的0对调,然后把其余的1全部移到前面就行了。
代码:
class Solution {
public:
string maximumOddBinaryNumber(string s) {
int n=s.size();
int i=0,j=n-1;
while(s[j]!='1'&&j>=0) j--;
swap(s[j],s[n-1]);
j--;
while(i<j){
while(s[i]!='0'&&i<n) i++;
while(j>=0&&s[j]!='1') j--;
if(i<j){
swap(s[i],s[j]);
i++;
j--;
}
}
return s;
}
};
性能:
时间复杂度:O(n)
空间复杂度:O(1)
相似题目:
美丽塔
题目描述:
分析:
Ⅰ数据比较小,直接暴力枚举山顶。
- 首先设flag=maxHight[i]
- 向左建塔,j=i-1,如果maxHight[j]>flag,为了保证从左向山顶递增,且总高度最大,就在j处建高度为flag的塔。如果maxHight[j]<flag,只能建maxHight[j]的塔,同时flag=maxHight[j]。综上,flag总是为min(maxHight[j],flag),可以先更新flag,然后建塔。
- 向右同理。
- ans=max(sum)
Ⅱ数据比较大
- 数组r[i],l[i]分别存第i座塔向右和向左第一个比maxHight[i]大的maxHight[j]的下标j。其中r[n-1]=n,l[0]=-1。
- 注意,找第一个比自己小的下标可以用已有的r[j],l[j],即j=l[j],j=r[j],查找非常快。
- 用rm[i]存用以第i座塔为山顶的美丽塔的右边的高度和(包括第i座塔),那么rm[i]=maxHight[i]*(j-i)+rm[j]。
- 用lm[i]存用以第i座塔为山顶的美丽塔的左边的高度和(包括第i座塔),那么lm[i]=maxHight[i]*(i-j)+rm[j]。
- sum[i]=rm[i]+lm[i]-maxHight[i]。
- ans=max(sum)
代码
Ⅰ.暴力枚举
class Solution {
public:
long long maximumSumOfHeights(vector<int>& maxh) {
int n=maxh.size();
long long ans=0;
for(int i=0;i<n;i++){
int flag=maxh[i],j=i-1;
long long sum=maxh[i];
while(j>=0){
flag=min(flag,maxh[j]);
sum+=flag;
j--;
}
j=i+1;
flag=maxh[i];
while(j<n){
flag=min(flag,maxh[j]);
sum+=flag;
j++;
}
ans=max(ans,sum);
}
return ans;
}
};
Ⅱ.
class Solution {
public:
long long maximumSumOfHeights(vector<int>& maxh) {
int n=maxh.size();
long long sum=0;
vector<long long > l(n),r(n),lm(n),rm(n);
l[0]=-1;
r[n-1]=n;
lm[0]=maxh[0];
rm[n-1]=maxh[n-1];
for(int i=1;i<n;++i){
int j=i-1;
while(j>=0&&maxh[j]>maxh[i]) j=l[j];
//向左边找第一个小于等于maxh[i]的下标
l[i]=j;
lm[i]=(long long)(i-j)*maxh[i];
if(j>=0)
lm[i]+=lm[j];
}
for(int i=n-2;i>=0;--i){
int j=i+1;
while(j<n&&maxh[j]>maxh[i]) j=r[j];
//向右边找第一个小于等于maxh[i]的下标
r[i]=j;
rm[i]=(long long )(j-i)*maxh[i];
if(j<n)
rm[i]+=rm[j];
}
for(int i=0;i<n;++i)
sum=max(sum,rm[i]+lm[i]-maxh[i]);
return sum;
}
};
性能
Ⅰ
时间复杂度:O(n^2)
空间复杂度:O(1)
Ⅱ
时间复杂度:O(n)
空间复杂度:O(n)
相似题目
2867. 统计树中的合法路径数目
这个我看题解也看不懂,数据结构也没学好,下次补上
总结
其实前三道都做过相似的题目,所以写起来挺轻松的,但是初见杀还是蛮严重的,第四题完全没有头猪
ps:感觉写题解好麻烦啊老师QAQ,让我回想起高中被迫做错题本的经历了,而且感觉根本写不过来QAQ,昨天上午做的力扣题,中间断断续续又做了CF,洛谷,牛客的题,现在才写完题解,等会CF又有题目要写QAQ