leetcode做题记录 1041 1647

文章讨论了两种优化的编程解决方案:一种是减少机器人绕圈问题的时间复杂度,另一种是找到字符频次唯一时的最小删除次数,通过统计和迭代方法实现高效计算。
摘要由CSDN通过智能技术生成

1041. 困于环中的机器人

简单做法

(python写多了c++都不会写了qwq)时间复杂度为4n

class Solution {
public:
    bool isRobotBounded(string is) {
        int x=0,y=0,m=0;
        int dx[]={0,-1,0,1};
        int dy[]={1,0,-1,0};
        is=is+is+is+is;
        for (int i=0;i<is.size();i++)
            if (is[i]=='G'){
                x=x+dx[m];
                y=y+dy[m];
            }
            else if (is[i]=='L')
                m=(m+1)%4;
            else
                m=(m+3)%4;
        return (x==0&&y==0);

    }
};

思考

其实可以不用四倍的,之间判断m是否为0就可以判断是否会绕圈了。

class Solution {
public:
    bool isRobotBounded(string is) {
        int x=0,y=0,m=0;
        int dx[]={0,-1,0,1};
        int dy[]={1,0,-1,0};
        for (int i=0;i<is.size();i++)
            if (is[i]=='G'){
                x=x+dx[m];y=y+dy[m];
            }
            else if (is[i]=='L') m=(m+1)%4;
            else m=(m+3)%4;
        return (x==0&&y==0)|m;

    }
};

1647. 字符频次唯一的最小删除次数

思路

用vis数组统计出每个频次出现的次数。例如vis数组为012,那么就是不为1的地方要挪到为0的地方,如果有0的地方不满足后面不为1的地方,就把自己全删掉。

在实际写代码的时候,从后往前推,如果有大于1的wr+1,如果有0的,wr-1。一直到1结束。

代码 50ms 击败64.34%

class Solution {
public:
    int vis[100005]={0};
    int a[27]={0};
    int maxn=0;
    int minDeletions(string s) {
        for (int i=0;i<s.size();i++){
            a[s[i]-'a']++;
        }
        for (int i=0;i<26;i++){
            if (vis[a[i]])maxn=max(maxn,a[i]);
            vis[a[i]]++;
        }
        int wr=0;int dis=0;
        for (int i=maxn;i>0;i--){
            if(vis[i]>1)wr+=(vis[i]-1);
            else if(vis[i]==0)wr=max(0,wr-1);
            dis=dis+wr;
        }
        return dis;
    }
};

其他解法

把所有的频次都从大到小铺开来,例如"ceabaacb"是3221,当pre=3,now=a[i]=2,符合,不做修改;当pre=2,now=a[i]=2,不符合,修改a[i]=a[i]-1=1,dis++;当pre=1,now=a[i]=1,不符合,修改为0,dis++

代码 46ms 击败83.22%

class Solution {
public:
    int a[27] = {0};
    int maxn = 0;
    int minDeletions(string s) {
        for (int i = 0; i < s.size(); i++) {
            a[s[i] - 'a']++;
        }
        sort(a, a + 26,greater<int>());
        int dis=0,pre=a[0];
        for (int i=1;i<26&&a[i]>0;i++){
            cout<<pre<<" "<<a[i]<<endl;
            if(pre<=a[i]){
                int temp=max(0,pre-1);
                dis+=a[i]-temp;
                a[i]=temp;
            }
            pre=a[i];
        }
        return dis;
    }
};

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值