今日学习:归并排序,爬楼梯,斐波那契

1.归并排序

对于归并排序的理解,力扣面试题10.01,给定两个排序好的数组,然后归并为一个有序数组。
归并排序一定要借助辅助数组的,所有先建立一个辅助数组,然后比较两个数组的元素,比较方式如下:

  • 如果A数组元素用完,则将B数组元素加入辅助数组中;
  • 如果B数组元素用完,则将A数组元素加入辅助数组中;
  • 如果A数组元素大于B数组元素,则将B数组元素放入辅助数组,并将B下标加1;
  • 如果B数组元素大于A数组元素,则将A数组元素放入辅助数组,并将A下标加1;

力扣面试10.01

小插曲:

  • 引用与其对象绑定后就不可更改,对引用所作的改变会改变原有对象;

  • vector的size与capacity有所不用,capacity一定是大于等于size的,当push_back后大小超过当前容量capacity时,vector会分配新的内存空间,一般是将当前容量翻倍。

对归并排序的理解:分治
自顶向下法
如果归并算法能将两个数组排序,它就能通过归并两个子数组来将整个数组排序。通过这个思想,我们将整个数组不断划分,直到分成每个数组大小为1,此时数组一定是有序的,然后采用归并算法排序,排序后的数组作为新的子数组与其他子数组归并到一起,完成排序。用到递归的方法。
自底向上法
可以先归并微小数组,再归并得到的子数组,直到将整个数组合并到一起。首先两两归并(每个数组大小为1),然后四四归并(每个数组大小为2),…每下一轮,子数组的大小都会翻倍。采用迭代的方法,代码量更少。部分代码如下:

for(int sz=1;sz<N;sz=2*sz) {	//sz为数组大小,每一轮都会翻倍
	for(int l0=0;l0<N-sz;l0+=2*sz) {  //l0是子数组索引,每次都会归并2*sz大小的数组,然后跳过2*sz的距离
		merge(a,l0,l0+sz-1,min(l0+2*sz-1,N-1);//merge算法略;之所以右边界取最小值是因为最后一个子数组的大小可能比sz要小。
		}
	}

复杂度分析
时间复杂度为NlogN,空间复杂度为O(n)
归并排序适合大量数据的排序。

2.爬楼梯

这个问题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效地构建,可以使用动态规划来解决这一问题。
dp[i]=dp[i−1]+dp[i−2];
70.爬楼梯
与斐波那契异曲同工。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值