算法思想 - 分而治之
分而治之是什么?
- 分而治之是算法设计的一种方法,属于算法思想;
- 它将一个问题分为多个和原问题相似的小问题,递归或迭代解决小问题,再将结果合并来解决原来的问题。
场景
归并排序
- 分:把数组一分为二
- 解:递归地对两个子数组进行归并排序
- 合:合并有序子数组
快速排序
- 选基准,按照基准把数组分为两个子数组
- 递归地对两个子数组进行快速排序
- 对子数组进行合并
题目
猜数字大小(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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦