【算法】小和问题
2019-04-12 10:10
106 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hello_ape/article/details/89226312
问题描述:在一个数组中,每一个元素左边比当前元素值小的元素值累加起来,叫做这个数组的小和
例如:[2,3,4,1,5]
2左边比2小的元素:无
3左边比3小的元素:2
4左边比4小的元素:2,3
1左边比1小的元素:无
5左边比5小的元素:2,3,4,1
小和small_sum = 2 + 2 + 3 + 2 + 3 + 4 + 1 = 17
可以使用归并排序思想,来解决小和问题
[code]int small_sum(int a[], int n) { if (a == NULL || n < 2) return 0; return small_sum(a, 0, n - 1); } int small_sum(int a[], int left, int right) { if (a == NULL || (right - left+1) < 2) return 0; //获取数组的中间位置 int mid = left + ((right - left) >> 1); /*小和问题 可以采用分治的思想 1、将数组划分为两部分 2、求左边一部分的小和 3、求右边一部分的小和 4、合并左边和右边,求左边部分在右边里的小和 5、将2、3、4部分求和,即为原数组的小和 */ return small_sum(a, left, mid) + small_sum(a, mid + 1, right) + merge_small_sum(a, left, mid, right); } int merge_small_sum(int a[], int left, int mid, int right) { //获取数组长度 int len = right - left + 1; //分配地址空间 int *temparry = (int *)malloc(sizeof(int)*len); //保存小和,初始值为0 int smallsum = 0; //左边数组的起始位置 int pos1 = left; //右边数组的起始位置 int pos2 = mid + 1; //辅助数组的当前位置 int pos3 = 0; //如果左边数组或者右边数组没有越界 while (pos1 <= mid && pos2 <= right){ //计算小和,如果左边数值比右边数值小,则产生小和 smallsum += a[pos1] < a[pos2] ? (right - pos2 + 1)*a[pos1] : 0; //将最小值放入辅助数组下一个空闲位置 temparry[pos3++] = a[pos1] < a[pos2] ? a[pos1++] : a[pos2++]; } //拷贝剩余部分 while (pos1 <= mid){ temparry[pos3++] = a[pos1++]; } while (pos2 <= right){ temparry[pos3++] = a[pos2++]; } //将辅助数组赋值给原数组 for (int i = 0; i < len; ++i) a[i + left] = temparry[i]; //释放内存 delete temparry; //返回当前小和 return smallsum; }
相关文章推荐
- 甲乙两人互猜数字(鬼谷子问题)的逻辑推理与算法建模
- 算法系列之五:最长公共子序列(LCS)问题(非连续子序列)的两种解法
- 关于最短路径图算法实现的问题
- LeetCode题解 || Longest Substring Without Repeating Characters (O(n)算法)问题
- 贪心算法----装箱问题
- 归并排序(数据结构书上算法有些问题)
- 背包问题的遗传算法解法
- 关于求两个数的最小公约数和最小公倍数问题【经典算法】!
- Bellman-Ford 算法 单源最短路径问题
- 算法训练 Anagrams问题
- 关于一个判断Integer数是否为回文数的算法问题
- ST算法解决RMQ问题及UVA 11235题解
- Java实现算法之Brackets Sequence问题
- 全排列算法递归及STL实现,八皇后问题
- 算法设计--电路布线问题(分支限界法求解)
- 深度优先搜索1-棋盘问题(算法基础 第6周)
- 《PHP程序员面试笔试宝典》——如何回答算法设计问题?
- 在TX1上配置TLD算法环境遇到的问题(二)
- 机器学习(4)——回归算法:最小二乘法(无偏估计VS多重共线性问题)
- 算法 RMQ(Range Minimum Query)问题:Sparse-Table算法