首页 > 其他分享 >最大子串和(三种方法实现)

最大子串和(三种方法实现)

时间:2024-08-03 17:23:38浏览次数:11  
标签:子串 int ll mi long num 三种 方法

如果错误或不周,请指教谅解,感谢你的观看

题目大意 :对于一个数组a,有n个整数,求出最大的子串和,子串中的元素数量至少为1个

举个例子,求下列最大的子串和

6
1 -2 5 2 -3 5   

输出为 9

2

-1 -2

输出为 -1

下面提供代码,代码中自含解释 (就不提供主函数,可能会影响观感)

第一种方法:

typedef long long ll;
int n;
ll a[N], dp[N];
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    dp[1] = a[1];
    ll num = a[1]; // 初始化 避免全为负数的情况
    for (int i = 1; i <= n; i++)
    {
        dp[i] = max(a[i], a[i] + dp[i - 1]); // dp[i]表示到当前位置的最大子串和
        num = max(num, dp[i]);
    }
    cout << num;
}

 第二种方法:

typedef long long ll;
int n;
ll a[N];
void solve()
{
    cin >> n;
    ll ma = LONG_MIN, mi = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        a[i] += a[i - 1];        // a[i]表示到当前位置的子串和
        ma = max(ma, a[i] - mi); // a[i]-mi得到答案
        mi = min(mi, a[i]);      // mi表示最小的子串和
    }
    cout << ma;
}

第三种方法:

int n;
ll a[N];
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    ll num = a[1], sum = 0; // num进行初始化 避免全为负数的情况
    for (int i = 1; i <= n; i++)
    {
        sum += a[i];
        if (sum > num)
            num = sum;
        if (sum < 0)
            sum = 0; // 两个if顺序不能换
    }
    cout << num;
}

个人喜欢最后一种

对于全为负数的情况,上面三种方法依然可行

再次感谢观看!!!

标签:子串,int,ll,mi,long,num,三种,方法
From: https://blog.csdn.net/wycwhacker/article/details/140881167

相关文章

  • Java中的不同数据类型的方法调用
    数组在Java中,数组是一个基础的数据结构,用来存储固定大小的同类型元素。数组本身在Java中是一个对象,但它的方法比较有限,主要依赖于Java的Arrays类来进行数组操作。排序sort():对整个数组或指定范围的元素进行排序。重载版本支持所有基本类型数组和对象数组。对于对象数组......
  • Python中动态类和动态方法的创建与调用
    借助于python的动态语言特性,很容易对对象进行添加方法或者属性,这也是python的灵活之一。动态生成类的属性及其方法在某些情况可能要根据不同的参数来动态生成不同的实例方法、静态方法、类方法。下面的例子中则展示了如何动态地向类中添加属性和方法。importtypesclassPers......
  • 有没有办法阻止 setUp() 为 python 测试用例中的每个测试方法启动浏览器?
    我正在练习编写Web自动化测试用例,并且编写了一些函数来测试登录、在用户主页中查找我的用户名以及测试GitHub的注销功能。然而,我通过经验和阅读了解到setUp()是在每个测试方法之前启动的,而我的问题是在每个测试方法之前它都会打开一个新的浏览器。我希望我的所有测......
  • 【Android驱动07】Sensor传感器框架以及驱动移植和调试方法(Hal层部分)
    一,Androidsensor系统架构Hal就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(UserSpace),一层放在内核空间(KernelSpace),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。二,HAL层Sen......
  • 方法的实参和形参
    方法的实参和形参一、实参(ActualParameters)定义:实参是在调用方法时传递给方法的实际值或对象的引用。位置:实参位于方法调用语句中。作用:实参用于传递数据给方法内部使用。类型:实参可以是基本数据类型(如int、double等)或对象引用。数量:调用方法时提供的实参数量必须与方法定......
  • 方法的定义
    方法的基本定义(将功能重复的代码封装成一段独立的代码,通过调用的方式以提高代码的复用性(减少代码重复))限制条件:在主类中定义,并且由主方法直接调用的方法形式。方法就是一段可以被重复调用的方法块。在Java中要想进行方法的定义,则可以使用如下的语法完成。publicstatic返回类......
  • 方法的重载
    方法的重载(在同一个类中,有一个以上的同名方法)指得是一个类在Java中,同一个类中的多个方法可以有相同的方法名称,但是有不同的参数列表,这就称为方法重载(methodoverloading)。参数列表又叫参数签名,包括参数的类型、参数的个数、参数的顺序,只要有一个不同就叫做参数列表不同。......
  • 编程实现模重复平方法的算法
    模重复平方法(又称为平方法)是一种用于求解非线性方程的迭代算法。算法的基本思路是通过不断迭代替换变量的方式,将非线性方程转化为线性方程,从而求解方程的根。以下是一个编程实现模重复平方法的算法的示例:```pythondeffixed_point_iteration(f,x0,epsilon,max_iterations)......
  • 方法的作用
    方法的作用Java中方法(Method)的作用非常广泛,它们是面向对象编程的核心概念之一方法在Java中的一些主要作用:封装行为:方法允许将特定的行为封装在代码块中,这有助于组织和模块化程序。提高代码重用性:通过定义通用的方法,可以在不同的上下文中重复使用相同的代码,避免重复......
  • coreseek4.1使用sphinx做索引的索引控制shell脚本及逻辑 及 linux安装coreseek4.1的sp
    一、coreseek4.1使用sphinx做索引的索引控制shell脚本及逻辑    sphinx做索引时索引数据来源可以有多种方式,比如数据库mysql,pgsql,mssql,odbc,也可以是python脚本,也可以是xml数据文件,xmlpipe(publish:November1,2017-Wednesday)。    一般来说,如果索引的数据比较简单,......