前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >求m的n次方(优化时间复杂度)

求m的n次方(优化时间复杂度)

作者头像
余生大大
发布2022-11-02 16:38:34
7810
发布2022-11-02 16:38:34
举报
文章被收录于专栏:余生大大余生大大

题目

今天卷哥去一家国际厂面试,刚坐下打完招呼面试官就问了第一个问题。

在这里插入图片描述
在这里插入图片描述

卷哥心想这问的什么问题,过流程的吗?

面试官眉头紧皱:

在这里插入图片描述
在这里插入图片描述

看面试官的意思是对卷哥解法的时间复杂度不太满意,卷哥想了15分钟没想出来;

卷哥:卒

题解

正常循环求mn次方,时间复杂度为O(n)

假设m为3n为9,公式为:3 x 3 x 3 x 3 x 3 x 3 x 3 x 3 x 3 = 19683

在这里插入图片描述
在这里插入图片描述

提取重复内容( 3 * 3 ) 为基础值,那平方次数为n/2 需要额外判断n为奇数偶数,奇数得到结果值*m为最终结果。

在这里插入图片描述
在这里插入图片描述

如果为奇数n则时间复杂度为O(n/2-1),偶数n就是O(n/2)

代码如下:

代码语言:javascript
复制
    public int process(int m,int n){
        int index = n/2,rm = m*m,result = rm;
        for (int i = 0; i < index-1; i++) {
            result *= rm;
        }
        if (n % 2 != 0){
            result *= m;
        }
        return result;
    }

那还有没有时间复杂度更低的算法?

上面我们是固定的两个值缩减,效率固定了就是O(n/2),我们再分析一下:求平方的m值是固定的,那我们能不能不固定两个值缩减,反正值固定,每一次平方后n/2这样对数的算法效率就很快了。

但是这种情况下如果有奇数n/2后则会漏掉一次平方的过程,所以如果n奇数当前值就需要* m原始值一次。

代码如下:

代码语言:javascript
复制
    public int process(int m,int n){
        int r=1,base=m;
        while(n!=0){
            if(n%2 != 0)
                r*=base;
            base*=base;
            n/=2;
        }
        return r;
    }

步骤图:

在这里插入图片描述
在这里插入图片描述

最后r x base = 19683就等同我们上图余出来一个单个m值需要与结果值进行平方

在这里插入图片描述
在这里插入图片描述

这种方式的时间复杂度为O(logn),相对时间复杂度更低。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 题解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档