为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第35天 数据结构和算法

算法思想 - 分而治之

分而治之是什么?

  • 分而治之是算法设计的一种方法,属于算法思想;
  • 它将一个问题分为多个和原问题相似的小问题,递归或迭代解决小问题,再将结果合并来解决原来的问题。

场景

归并排序
  • 分:把数组一分为二
  • 解:递归地对两个子数组进行归并排序
  • 合:合并有序子数组
快速排序
  • 选基准,按照基准把数组分为两个子数组
  • 递归地对两个子数组进行快速排序
  • 对子数组进行合并

题目

猜数字大小(leetcode - 374)
  • 该题目在学习二分搜索的时候已经实现过,二分搜索其实也是采用了分而治之的思想

昨天已经按照迭代实现了,如下

var guessNumber = function(n) {
    let start = 1;
    let end = n
    while(start <= end){
        let mid = Math.floor((start + end) / 2);
        let temp = guess(mid);
        if(temp === -1) {
            end = mid - 1;
        }else if(temp === 1) {
            start = mid + 1;
        }else if(temp === 0){
            return mid;
        }
    }
};

时间复杂度:O(logN)
空间复杂度:O(1)

现在按照递归来实现,如下

var guessNumber = function(n) {
    const rec = (start, end) => {
        if(start > end) return;
        let mid = Math.floor((start + end) / 2);
        let temp = guess(mid);
        if(temp === 0) {
            return mid;
        }else if(temp === 1) {
            return rec(mid + 1, end);
        }else if(temp === -1) {
            return rec(start, mid - 1);
        }

    }
    return rec(1, n)
}; 
时间复杂度:O(logN)
空间复杂度:O(logN)

迭代和递归的时间复杂度相同,但是迭代的空间复杂度要优于递归。

小结

  • 分而治之:把大问题成小问题,决小问题,再并起来

  • 使用场景:归并排序、快速排序、猜数字大小等等…

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消