3月14日 分治法相关练习记录
分治法是我们正式接触的第一个算法,它的求解可以简要概括为:
划分 求解子问题 合并
分治法要求子问题原问题之间形式相同,子问题之间相互独立,在实际运用中,如何划分让程序的时间空间复杂度尽可能降低是我们需要考虑的关键。
数组元素循环移动
题目内容:
设计分治算法实现将字符数组A[n]中所有元素循环左移k个位置,例如,对abcdefgh循环左移3位得到defghabc。
输入格式:
第一行为数组长度n
第二行为循环左移数k
第三行为数组中元素
输出格式:
循环左移k个位置后的结果
思路:
第一反应是考虑数组需要移动的数量k,如果k小于元素的数目n,那么创建第二个空数组,将前k个元素暂时存入新数组并删除,将剩余元素向前移动,完成后将新数组中元素接在原数组之后。
如果k大于n,那么使用模的思想,对元素的下标进行运算得出最终落点。
这种方法比较繁琐,可能需要占据一个新数组的空间,而且时间复杂度也高。
如果从使用分治法的思路来考虑,从网上检索得到了一种数学思路,同样将数组分成以k为划分的两个部分,通过两次逆序处理得到最终落点。
代码如下
*#include<stdio.h>
#include<stdlib.h>
#include;
using namespace std;
void math(char a,int start,int end){
int i;
char t;
for(i=0;i<(end-start+