标签:return 记录 int mid 算法 序列 ThisSum 数据结构 MaxSum
1、最大子序列和
暴力破解
int MaxSubsequenceSum(const int A[],int N){
int ThisSum,MaxSum,i,j,k;
MaxSum = 0;
for( i = 0,i < N,i++ ){//对整个数组进行遍历
for( j = i; j < N; j++ ){//确定子序列
ThisSum = 0;//记录当前子序列的和
for( k = j; k <= j; k++){
ThisSum += A[k]; //进行求和
if(ThisSum > MaxSum){
MaxSum = ThisSum; //更新最大子序列和
}
}
}
}
return MaxSum;
}
时间复杂度O(N^3)
从上面的算法中可以看出,中间的两个循环可以省略,直接在遍历整个序列中就进行求和,然后不断比较每次求和的大小。
优化
int MaxSubsequenceSum(const int A[],int N) {
int ThisSum,MaxSum,i;
ThisSum = MaxSum = 0;
for( i = 0; i < N; i++) {
//遍历序列的时候就开始相加
ThisSum += A[i];
if(ThisSum > MaxSum) {
MaxSum = ThisSum;
}
else if(ThisSum < 0) {
/*
如果当前的和0,说明序列中存在负数,且负数的和大于正数
此时就让ThisSum等于0,不考虑之前负数的子序列,从下一位开始
*/
ThisSum = 0;
}
//如果ThisSum < MaxSum不做处理,继续加下一位
return MaxSum;
}
}
时间复杂度O(N)
2、对分查找
int BinarySerch(const int A[],int X,int N ) {
int low,high,mid;
while(low <= high){
mid = (low + high) / 2;
if(A[mid] < X) {
//说明要查找的数中间的右半部分
low = mid + 1;
}else if(A[mid] > X){
high = mid - 1;
}else {
return mid;
}
return -1;
}
}
3、欧几里得算法
欧几里得算法是用来求最大公因数
最大公因数:同时能够整除二者的最大整数
unsigned int Gcd(unsigned int M,unsigned int N) {
unsigned int Rem;
while( N > 0 ){
//两个数不断进行取余
Rem = M % N;
M = N;
N = Rem;
}
return M;
}
如果M>N 则 M mod N < M/2
标签:return,记录,int,mid,算法,序列,ThisSum,数据结构,MaxSum 来源: https://blog.csdn.net/weixin_43900407/article/details/112694131
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。