最大子段和c(c语言实现)

1,题目

2,各种算法

  • 暴力解决,就是所有的情况都遍历一遍,然后说,我找到最牛逼的啦
int MaxSubseqSum1(int A[], int N, int* pidxStart, int* pidxEnd)
{ int sum = A[0], tempSum = 0;int i, j, k;*pidxStart = 0, *pidxEnd = 0;for (i = 0; i < N; i++) {for (j = i+1; j < N; j++) {tempSum = 0;for(k = i; k <= j; k++) {tempSum += A[k];}if (tempSum > sum) {sum = tempSum;*pidxStart = i;*pidxEnd = j;}}}return sum;
}

粗略的看三重循环,算法复杂度是O(n^3),空间上没有大空间的开辟。

  • 好一点的暴力解决

int MaxSubseqSum2(int A[], int N, int* idxStart, int* idxEnd)
{int ThisSum, MaxSum = 0;int i, j;for (i = 0; i < N; i++) { //遍历所有的起点,以i为i起点ThisSum = 0;for (j = i; j < N; j++) { //j为终点ThisSum += A[j];if (ThisSum > MaxSum) {MaxSum = ThisSum;*idxStart = i;*idxEnd = j;}}}return MaxSum;
}

算法复杂度O(n^2),和第一个算法相比到底是哪个地方优化了呢?原因在于很多子段和有重叠的地方,第一个算的法重复计算重复计算特别多,第二个相对少多了,但还是有很多子段和是重叠计算的,这说明这个算法还有很大的提高的空间。

  • 分治算法

int max(int a, int b, int c) 
{int temp = a >= b ? a : b;return temp >= c ? temp : c;
}int MaxSubseqSum3(int A[], int beg, int end)
{if (beg == end) {return A[beg];}int mid = (beg + end) / 2;int left, right, lSum = A[mid], thislSum = 0, rSum = A[mid+1], thisrSum = 0;int i;left = MaxSubseqSum3(A, beg, mid);right = MaxSubseqSum3(A, mid+1, end);for (i = mid; i >= 0; i--) {thislSum += A[i];if (thislSum > lSum) {lSum = thislSum;}}for (i = mid+1; i <= end; i++) {thisrSum += A[i];if (thisrSum > rSum) {rSum = thisrSum;}}return max(left, lSum+rSum, right);
}

分治算法因为使用到递归,所以一般实际中也不会用,因为在实际中数据偏大,递归过程中会开辟很多的空间,造成空间超出内存。其优美之处在于其算法复杂度的数学分析上,其算法复杂度是O(n * ln(n)),具体参看《算法导论》。

  • 在线算法,先看其算法

//在线算法
int MaxSubseqSum4(int A[], int N)
{int i = 0;int thisSum = 0, sum = 0;for (i = 0; i < N; i++) {thisSum += A[i];if (thisSum > sum) {sum = thisSum;} else if (thisSum <= 0) {thisSum = 0;}}return sum;
}


很多数学概念学起来是枯燥无味的,因为它们是现实世界的抽象,完全扭曲了我们观察事物的直观感觉,另一方面,数学是真正的抓住了核心和本质,所以很多繁杂的现象,可能用一个方程式子就完全描述了,譬如说爱因斯坦的质量方程,麦克斯韦的电磁方程组。

看上面的图,我们用数学语言描述一个过程:我们要寻找物质A,寻找的范围是T,可是T的范围太大了,可能花费多少力气都完不成;由于物质A具有性质B,那么B性质就是物质A的必要条件(也就是必须满足的条件),在T中发现满足B性质的是范围C,那么我们直接在C范围中寻找物质A就行了,而且范围C非常小,使得我们很快的找到了物质A。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1007. Maximum Subsequence Sum (25)

Sample Input: 10 -10 1 2 3 4 -5 -23 3 7 -21 Sample Output: 10 1 4 错误代码如下&#xff1a; #include <stdio.h>int MaxSubseqSum4(int A[], int N, int* pstart, int* pend) {int i 0;int tempStart; //记录最大子段和位置int thisSum 0, sum 0;tempStart …

实验项目 3-4:一元多项式的乘法与加法运算

代码如下&#xff1a; /*************************************************************************> File Name: AddPoly.c> Author: YueBo> Mail: yuebowhu163.com> Created Time: 2016年12月17日 星期六 13时00分35秒***************************************…

树的同构

输入样例1&#xff08;对应图1&#xff09;&#xff1a;8A 1 2B 3 4C 5 -D - -E 6 -G 7 -F - -H - -8G - 4B 7 6F - -A 5 1H - -C 0 -D - -E 2 -输出样例1:Yes输入样例2&#xff08;对应图2&#xff09;&#xff1a;8B 5 7F - -A 0 3C 6 -H - -D - -G 4 -E 1 -8D 6 -B 5 -E - -…

.Net 中接口应用的知识点(排序)

接口 接口可以看作是多态的一种。它打破了里氏替换原则。即不是共同的生物&#xff0c;比如动物&#xff08;狗&#xff09;和人&#xff08;老师&#xff09;&#xff0c;这两个类 却都有吃这种方法。但是继承里不能把老师和狗归为一个类。所以这时用接口来解决这种问题。 语法…

leetcode 121

leetcode 121 dp? my answer class Solution { public:int maxProfit(vector<int>& prices) {int bdprices[0],sd0;int max_num0;for(int i1;i!prices.size();i){sdprices[i];if(sd<bd) bdsd;else if(sd-bd>max_num)max_numsd-bd;}return max_num;} };END

.net中的硬盘操作(针对Windows )

1&#xff0c;文件与文件夹的读取&#xff08;针对Windows &#xff09; 这是程序员的基本功。 做这种操作首先要引入一个命名空间 using System.IO I input 输入 O output 输出File.Create("C:\1.txt"); file是个静态类&#xff0c;里面有很多方法&#xff0c;多是…

优秀设计师是如何炼成的,看搜狐如何做设计

《设计之下》终于上市了&#xff0c;回忆一下整个成书的过程&#xff0c;不得不佩服作者&#xff0c;从最开始的干净利落&#xff0c;到最终的细节的调整&#xff0c;作为编辑我对他们的认识逐渐加深&#xff0c;也慢慢了解了优秀设计师是如何炼成的。 这本书源于2012年12月份的…

1092. To Buy or Not to Buy (20)

1092. To Buy or Not to Buy (20) 时间限制100 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueEva would like to make a string of beads with her favorite colors so she went to a small shop to buy some beads. There were many colorful strings …

.net动态控件的使用(listview ,treeview,tabControl)

对于控件中显示的数据可能是不固定的。如果固定&#xff0c;数据发生了变化&#xff0c;又要重新设计&#xff0c;这样浪费成本&#xff0c;资源。 所以有用代码操作控件&#xff0c;自由度&#xff0c;可控度高。 1&#xff0c;树控件 //把 tv 作为全局变量 &#xff0c; 这是…

泡茶看数据结构-临时(对象设计技术)

一.开场白 第二次《DATA STRUCTURES AND PROBLEM SOVLING WITH C》英文授课&#xff0c;让我产生英文写文章的念头。但是&#xff0c;慢慢开始参合英文吧。一下子写的话&#xff0c;怕写出来博客园首页都不敢收录了。^_^&#xff01;今天&#xff0c;从课堂和自己下午看总结下,…

前端学习(1002):简洁版滑动下拉菜单问题解决

快速滑动 不停切换 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><scrip…

js bom and dom

以下的代码只是一些小的例子。我画了一张图来总结js大的结构 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script>//Point 1 delayer and timer (BOM browser Object Model)var delayer;var tim…

leetcode 383 赎金信 C++

自己想的&#xff0c;一个思路两个解法&#xff0c;从字符串中的第一个唯一字符的思路搬过来的 one class Solution { public:bool canConstruct(string ransomNote, string magazine) {int table2[26]{0};for(int i0;i!magazine.length();i){table2[magazine[i]-a];}for(int …

Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类

话接上篇。成功配置好QtLuatoLua后&#xff0c;我们可以实现在Lua脚本中使用各个Qt的类。直接看代码吧。 #include "include/lua.hpp" #include <QWidget> #include <QApplication> #include <QFile> #include <QDebug>static int tolua_new…

1099. Build A Binary Search Tree (30)

1099. Build A Binary Search Tree (30) 时间限制100 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueA Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains o…