手记

【九月打卡】第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)

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

小结

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

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

0人推荐
随时随地看视频
慕课网APP