超市的都是使用了双层循环了的,那么有没有办法把时间复杂度降到O(n)呢,有,多用几个单层循环代替原本的双层循环嵌套就行了
那么我们需要把公式化简一下,假如数组有5个数
a11,a12,a13,a14,a15
那么sum=a11*a12+a11*a13+a11*a14+a11*a15+…..
化简,提取公因式,sum=a11*(a12+a13+a14+a15)+a12*(a13+a14+a15)+a13*(a14+a15)+a14*a15
那么我们可以用一个数组来存储每一次的前缀和,然后最后再对应相乘
例如:
数组arr[5]={1,2,3,4,5}
arr_t[4]={5,4+5,3+4+5,2+3+4}

  1. #include <stdio.h>
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int n;
  6. scanf("%d", &n);
  7. // 定义数组 arr 存储输入的无符号长整型数值,sum 用于累加,arr_t 用于存储后缀和
  8. unsigned long long int arr[n], sum = 0, arr_t[n];
  9. for (int i = 0; i < n; i++)
  10. {
  11. scanf("%llu", &arr[i]);
  12. }
  13. int len = 0; // 初始化 len 为 0,用于记录 arr_t 的长度
  14. // 计算后缀和
  15. for (int i = n - 1; i >= 1; i--)
  16. { // 从 n-1 开始,到 1(不包括 0)
  17. sum += arr[i]; // 将当前元素加入 sum
  18. arr_t[len] = sum; // 将当前的后缀和存入 arr_t
  19. len++; // 增加 arr_t 的长度
  20. }
  21. sum = 0; // 重置 sum 为 0,以便进行下一步的累加计算
  22. // 计算最终的和
  23. for (int i = 0, j = len - 1; i < n - 1, j >= 0; i++, j--)
  24. {
  25. sum += arr[i] * arr_t[j]; // 将 arr 的元素与对应的 arr_t 的元素相乘,并累加到 sum
  26. }
  27. printf(" %llu", sum);
  28. return 0;
  29. }
点赞(2)
 

0 分

0 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论