因为作业代码涉及隐私,所以文章只提供解题思路和有关拓展,若实在需要源码可以私信
作业:
习题课作业:
用更快更好的算法算上课第一个演示程序(找前个数位之和等于后几个数位之和的数的个数。如abcdef,
需a+b+c=d+e+f)。并且能够在程序中比较方法之间的优劣:内存占用,运行时间等参数。
全部跳过直接看解题算法点这里:↓↓↓↓↓↓
写在前面
1, 如何在递归中使用指针来表示数组结尾(传入一个一直指向指针头部的参数, 并利用它表示出数组的范围)
2,指针参数的自增需要注意是先增还是后增,尾递归add(arr++, p)和add(++arr, p)是不同的结果
3,多维数组的声明需要将双箭头用空格隔开 std::vector<std::vector<float> > //right!
4,for循环的终止条件和变化方式是不一定必须写在开头括号里的,也可以写在循环体内部以便灵活使用
5,vector的push_back,只可以push进其“规定类型”的“一个”元素。
eg:三维数组可push进一个二维数组,一维int数组push进入一个int
6,在多层循环中可以将一些语句尽量放在外层循环中,时间复杂度不变,但是可以减少运算量
7, 函数作为参数传到另一个函数时,使用函数指针, 该函数的参数只需要写出数据类型就好
eg: func2(int (*func)(int, int) )
8,通过更缜密的数学推理,可以获得更优美的代码
有关拓展
|| 为了求数组中每一个数的平方和,写了个使用指针的递归函数 稍微复习
//明确函数功能:求出放入的数组的平方
//定好尾头:尾:数组中无值 头:第一个数求好平方后加第二个数的平方
int add(int* arr, int *p) {
if(arr > p+(sizeof(p)/sizeof(*p)) )
return 0;
return *arr * (*arr) + add(++arr,p);
}
|| 可以用c++自制一个python中的map高级函数,用于返回数组的个元素平方和
int myMap(int (*func)(int), vector<int> arr) {
int res = 0;
for (vector<int>::iterator it = arr.begin(); it != arr.end(); it++) {
res += (*func)(*it);
}
return res;
}
int sqrt(int x) {
return x * x;}
-> vector<int> arr = {
1,2,3,4,5 };
-> int res = myMap(sqrt, arr);
|| 回忆类似写法的leetcode题,使用双指针使得数组返回三数之和的
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1,