做题记录(2023/9/24力扣周赛)(未完)

目录

前言

8048.最大二进制奇数

题目描述:

分析:

代码:

性能:

相似题目:

美丽塔

题目描述:

分析:

代码

性能

相似题目

2867. 统计树中的合法路径数目

总结


前言

        老师说做题要写题解,因为以后还会经常写各种地方的题,所以就集中在CSDN上写了,第一次写,有什么问题我会改QAQ,然后就是还是一个初学者其实不太懂“贪心算法”的严格证明,或是“单调栈”什么的,听灵神(灵茶山艾府)讲解其实也只是一知半解,所以就是随便写写而已。

8048.最大二进制奇数

题目描述:

做题记录(2023/9/24力扣周赛)(未完)_第1张图片

分析:

这道题没有什么难的,题目要求首先是奇数,那么就把字符串里面的一个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=0&&s[j]!='1') j--;
            if(i

性能:

时间复杂度:O(n)

空间复杂度:O(1)

相似题目:

31. 下一个排列

1223:An Easy Problem

美丽塔

100049.美丽塔Ⅰ

100048.美丽塔Ⅱ

题目描述:

做题记录(2023/9/24力扣周赛)(未完)_第2张图片

分析:

Ⅰ数据比较小,直接暴力枚举山顶。

  • 首先设flag=maxHight[i]
  • 向左建塔,j=i-1,如果maxHight[j]>flag,为了保证从左向山顶递增,且总高度最大,就在j处建高度为flag的塔。如果maxHight[j]
  • 向右同理。
  • 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& maxh) {
      int n=maxh.size();
      long long ans=0;
      for(int i=0;i=0){
          flag=min(flag,maxh[j]);
          sum+=flag;
          j--;
        }
        j=i+1;
        flag=maxh[i];
        while(j

Ⅱ.

class Solution {
public:
    long long maximumSumOfHeights(vector& maxh) {
      int n=maxh.size();
      long long sum=0;
      vector 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=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(jmaxh[i]) j=r[j];
        //向右边找第一个小于等于maxh[i]的下标
        r[i]=j;
        rm[i]=(long long )(j-i)*maxh[i];
        if(j

性能

时间复杂度:O(n^2)

空间复杂度:O(1)

时间复杂度:O(n)

空间复杂度:O(n)

相似题目

1264:【例9.8】合唱队形

2867. 统计树中的合法路径数目

这个我看题解也看不懂,数据结构也没学好,下次补上

总结

其实前三道都做过相似的题目,所以写起来挺轻松的,但是初见杀还是蛮严重的,第四题完全没有头猪

ps:感觉写题解好麻烦啊老师QAQ,让我回想起高中被迫做错题本的经历了,而且感觉根本写不过来QAQ,昨天上午做的力扣题,中间断断续续又做了CF,洛谷,牛客的题,现在才写完题解,等会CF又有题目要写QAQ

你可能感兴趣的:(题解,leetcode,笔记,经验分享)