歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

求兩直線交點問題C++求解

題目:
輸入一個整形數組,數組裡有正數也有負數。數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。求所有子數組的和的最大值。要求時間復雜度為 O(n)。例如輸入的數組為 1, -2, 3, 10, -4, 7, 2, -5,和最大的子數組為 3, 10, -4, 7, 2,因此輸出為該子數組的和 18。
代碼思路
共有兩種方法:1、暴力破解法,三重循環遍歷數組,缺點時間復雜度不是O(n)。2、動態規劃求解
第一種方法代碼:暴力破解法:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
void main()
{
int i = 0, j = 0, k = 0;
int n = 8;
int a[8] = { 1, -2, 3, 10, -4, 7, 2, -5 };
int max = -32768;
int sum = 0;
for (i = 0; i < n; i++)
{
for (j = i; j < n; j++)
{
for (k = i; k <= j; k++)
{
sum = a[k] + sum;
if (max < sum)
{
max = sum;
}
}
sum = 0;
}
}
printf("最大數為:%d", max);
system("pause");
}
第二種算法 動態規劃
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
void main()
{
int i = 0;
int n = 8;
int a[8] = { 1, -2, 3, 10, -4, 7, 2, -5 };
int max = -32768;
int sum = 0;
for (i = 0; i < n; i++)
{
sum = sum + a[i];
if (sum < 0)
{
sum = 0;
}
if (sum>max)
{
max = sum;
}
}
if (max == 0)
{
max = a[0];
for (i = 0; i < n; i++)
{
if (a[i]>max)
{
max = a[i];
}
}
}
printf("最大數為:%d", max);
system("pause");
}

Copyright © Linux教程網 All Rights Reserved