C语言最大子序列和三种常用解决方法

2023-11-09

注:看不懂评论区提问,有问必答。

问题:给定K个整数组成的序列{ N​1​​, N​2​​, ..., N​K​​ },“连续子列”被定义为{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2,1,-3,4,-1,2,1,-5,4},其连续子列{ 4,-1,2,1 }有最大的和6。

输入:数组个数k,整数数组a[MAXN],整数之间空格隔开。

输出:最大子序和maxsum。

一、双重循环:

T(n)=O(n2)

#include <stdio.h>
#include <stdlib.h>
#define MAXN 100000  //数组最大空间
int main()
{
   int k,i;
   int a[MAXN]={0};
   scanf("%d",&k);
   for(i=0;i<k;i++)
    scanf("%d",&a[i]);
   printf("%d",Maxsub(a,k));

   return 0;


}
int Maxsub(int A[],int N)
{
    int thissum,maxsum=A[0];
    int i,j;
    for(i=0;i<N;i++)//从第一项开始遍历,i为子列左端部分
    {
        thissum=0;//每一回合置0
        for(j=i;j<N;j++)//j为子列右端部分,A[i]到A[j]为子列
        {
            thissum+=A[j];
            if(thissum>maxsum)//取最大值
                maxsum=thissum;
        }
    }
    return maxsum;

}

leetcode试题测试

 二、分治法

从中间分开,利用子程序递归分别解决左半部分和右半部分最大子序列和,最后解决整体的最大子序列和。

T(n)=T(n/2)+T(n/2)+O(n)=O(nlogn)

#include <stdio.h>
#include <stdlib.h>
#define MAXN 100000   //数组最大空间
int main()
{
   int k,i;
   int a[MAXN]={0};
   scanf("%d",&k);
   for(i=0;i<k;i++)
    scanf("%d",&a[i]);
   printf("%d",Maxsub(a,k));

   return 0;


}
/*统一接口*/
int Maxsub(int list[],int N)
{
    return Divide(list,0,N-1);
}
/*分治函数*/
int Divide(int list[],int left,int right)
{
    int maxleftsum,maxrightsum;
    int maxleftbordersum,maxrightbordersum;

    int leftbordersum,rightbordersum;

    int center,i;



    /*递归终止条件,子列只有一个数字*/

    if(left==right)
    {
            return list[left];
    }
    /*分治*/
    center=(left+right)/2;
    maxleftsum=Divide(list,left,center);
    maxrightsum=Divide(list,center+1,right);



    /*跨分界线最大子序和*/


    maxleftbordersum=list[center];
    leftbordersum=0;
    for(i=center;i>=left;i--)
    {
        leftbordersum+=list[i];
        if(leftbordersum>maxleftbordersum)
            maxleftbordersum=leftbordersum;
    }//左边结束


    maxrightbordersum=list[center+1];
    rightbordersum=0;
    for(i=center+1;i<=right;i++)
    {
        rightbordersum+=list[i];
        if(rightbordersum>maxrightbordersum)
        maxrightbordersum=rightbordersum;
    }//右边结束

    /*返回分治结果*/

    return Max3(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);
}

    int Max3(int A,int B,int C)//三者求最大
    {
        return (A>B)?(A>C?A:C):(B>C?B:C);
    }

LeetCode试题测试

 


三、在线处理(目前最优算法)

子序列和出现负数时,提前归零。每输入一个数据及时处理。

遍历一遍数组,所以T(n)=O(n)

#include <stdio.h>
#include <stdlib.h>
#define MAXN 100000  //数组最大空间
int main()
{
   int k,i;
   int a[MAXN]={0};
   scanf("%d",&k);
   for(i=0;i<k;i++)
    scanf("%d",&a[i]);
   printf("%d",Maxsub(a,k));

   return 0;


}
int Maxsub(int A[],int N)
{
    int thissum,maxsum,i;
    thissum=0;
    maxsum=A[0];
    for(i=0;i<N;i++)
    {
        thissum+=A[i];
        if(thissum>maxsum)
            maxsum=thissum;/*更新最大值*/
        else if(thissum<0)/*子序列和为负*/
            thissum=0;/*置0*/
    }
    return maxsum;

}

LeetCode试题测试

注:有一部分来自网页借鉴,不喜勿碰。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言最大子序列和三种常用解决方法 的相关文章

  • 【备份与恢复】达梦8数据库归档开启方法

    一 归档相关参数 参数名称 默认值 推荐值 说明 ARCH FILE SIZE 128 2048 本地单个归档文件最大值 单位 M ARCH SPACE LIMIT 0 102400 归档大小上限 0 表示无限制 按数据量的 1 5 保留
  • React性能优化

    一 class组件性能优化1 shouldComponentUpdate 1 shouldComponentUpdate是react其中一个生命周期钩子 在页面要更新时调用 2 shouldComponentUpdate nextProps
  • Mave 项目 打包时添加 当前时间 版本号

    第一步要在pom xml中获取到打包时间 在pom xml文件的properties中添加如下内容
  • react入门教程案例井字棋(包含改进代码)

    react入门教程案例井字棋 包含改进代码 1 index js 2 index css 3 index html 1 index js import React from react import ReactDOM from react
  • 1201活动总结 & 致谢

    时间就是这样 有时候会过的很快 有时候会过得很慢 一晃 一天的时间就已经过去 活动就已经结束了 这次活动是我有史以来组织的最大一次规模的活动 不管是从时间长度还是参加人数等等各方面 都突破了历史记录 这是第一次做全天的活动 五场演讲 可惜的
  • notepadqq_Notepadqq Linux文本编辑器入门

    notepadqq 我不使用Windows 我的意思是操作系统 至少 不是在我自己的计算机上 也没有我自己的任何工作 当我是一名顾问时 我经常不得不在客户办公室外工作 这意味着使用他们的硬件 这也意味着在许多这些办公室中使用Windows
  • STM32F030 HAL库内部 FLASH读写

    目录 前言 读flash 写flash 主循环 参考 https blog csdn net mrlixirong article details 124787282 https www 163 com dy article GPVKMC5
  • 玩转Mysql系列 - 第21篇:什么是索引?

    这是Mysql系列第21篇 本文开始连续3篇详解mysql索引 第1篇来说说什么是索引 第2篇详解Mysql中索引的原理 第3篇结合索引详解关键字explain 本文为索引第一篇 我们来了解一下什么是索引 路人在搞计算机之前 是负责小区建设
  • CentOS虚拟机之间设置SSH免密登录

    原文链接 CentOS虚拟机之间设置SSH免密登录 需求 现有三台虚拟机 设置三台虚拟机之间互相SSH登录时不需要密码 如有以下三台虚拟机 需要三台虚拟机之间通过ssh可以免密登录 192 168 1 201 192 168 1 202 1

随机推荐

  • 增加新Ctreeview 提示未定义解决办法!

    在StdAfx h中加入 include
  • 华为OD测试岗面经,一周走完面试流程

    一周走完面试流程 10 18 机考 机试210 第一题 最大N个数与最小N个数的和 第二题 拼接URL 第三题 跳格子 性格测试 题目比较多 有一百多道 在三个选项中选出一个最符合的和一个最不符合的 答题的时候以积极乐观的心态去选择 尽量保
  • Photoscan/Metashape与Contextcapture联合建模

    Photoscan与Contextcapture联合建模以及激光与影像联合建模 使用Photoscan完成影像的地理坐标与投影坐标转换 Photoscan空三结果导出 Contextcapture导入空三区块 CC刺控制点并继续AT 倾斜摄
  • Mac 终端关闭tomcat报错 org.apache.catalina.startup.Catalina stopServer 严重: Error stopping Catalina

    Mac 终端关闭tomcat sh shutdown sh 报错 org apache catalina startup Catalina stopServer 严重 Error stopping Catalina 原因mac权限问题 到T
  • AdapterView及子类的相关学习整理

    一 了解 AdapterView 及其子类 这个图片是网上找的 主要是了解一下结构 其中AbsListView AbsSpinner AdapterViewAnimation依然是抽象类 实际使用时需要使用它们的子类 后面我会逐个练习这些子
  • python总结(九):python面向对象高级编程

    一 给实例绑定属性 方法 给类绑定方法 coding utf 8 class Student object pass 给实例绑定属性 s Student s name Jason Zhang s score 90 print s name
  • Mybatis中的一般查询

    1 经常要使用到根据文本框输入的内容来进行模糊查询 这个时候涉及到几个问题 xml文件怎么样写模糊查询语句 即怎么样拼接参数的问题 此外还需要判断某个传递的参数是否为空的问题 控制器中怎么样传递这个参数这样在xml文件中的if标签才可以使用
  • VUE element-ui之el-tree树形控件获取最后一级节点(无子节点的节点)

    步骤 模板中定义ref
  • Qt 富文本处理(11):表格和表格格式

    文章目录 前言 QTextTable类 QTextTableFormat类 QTextTableCell 类 QTextTableCellFormat 类 代码示例 总结 前言 富文本文档的表格相关类 QTextTable类 QTextTa
  • linux下通过.sh文件启动java程序

    http blog csdn net cnmcxiari article details 6673081 linux下通过 sh文件启动java程序 首先把java程序打成jar包 指定好主类 入口 sh文件如下 bin sh java X
  • 区块链会给医药行业带来哪些改变?

    我不是药神 上映以来好评如潮 票房大涨 是一部叫好又叫座的佳作 不仅豆瓣评分9 0 更被人民日报誉为近年来难得一见的经典电影 该片真实再现了白血病群体的生存现状 让观众对白血病患者有了深刻的认知 也将一个残酷的现实摆在面前 一场大病足以让一
  • 编译Hi3516DV300的SDK

    前言 如果您之前编译过EV200的SDK 那么您会发现 编译DV300的过程很类似 软件包直接拷贝 无需重新下载 通常在1 2个小时内能搞定SDK的编译 DV300的入门会简洁介绍 如果遇到编译错误 请你阅读EV200的编译过程和相应目录下
  • ACL 2023 :大模型的安全与可靠性、复杂逻辑查询、情感分析等

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 哔哩哔哩直播通道 扫码关注AI TIME哔哩哔哩官方账号预约直播 13 30 13 50 Yu Zhou NonSequential Graph Script Induction
  • jmap命令详解

    JVM常见命令之jmap jmap命令详解 jmap是一个很重要的命令 可以查看JVM内存使用情况 jmap帮助文档 参数解释 option 选项参数 pid 需要打印配置信息的进程ID executable 产生核心dump的Java可执
  • Linux学习笔记——例说makefile 头文件查找路径

    0 前言 从学习C语言开始就慢慢开始接触makefile 查阅了很多的makefile的资料但总感觉没有真正掌握makefile 如果自己动手写一个makefile总觉得非常吃力 所以特意借助博客总结makefile的相关知识 通过例子说明
  • Python os模块相关简介

    Python里os path isdir 等函数的作用和用法 一 用法和概念 Python里的os模块用于和系统进行交互 其里 os listdir 用于返回一个由文件名和目录名组成的列表 需要注意的是它接收的参数需要是一个绝对的路径 os
  • 使用 Docker 快速上手中文版 LLaMA2 开源大模型

    本篇文章 我们聊聊如何使用 Docker 容器快速上手朋友团队出品的中文版 LLaMA2 开源大模型 国内第一个真正开源 可以运行 下载 私有部署 并且支持商业使用 写在前面 感慨于昨天 Meta LLaMA2 模型开放下载之后 GitHu
  • C++中随机数的生成

    一 伪随机数 在C 中要生成随机数 首先要include一个文件
  • 手机屏幕测试html,华为手机屏幕检测代码是什么

    类型 系统工具大小 1 4M语言 中文 评分 10 0 标签 立即下载 华为手机很多操作代码用户记住后是可以快捷使用的 有小伙伴想要进行屏幕检测 那华为手机屏幕检测代码是什么 西西小编来为大家介绍 华为手机屏幕检测代码是什么 华为手机屏幕检
  • C语言最大子序列和三种常用解决方法

    注 看不懂评论区提问 有问必答 问题 给定K个整数组成的序列 N 1 N 2 N K 连续子列 被定义为 N i N i 1 N j 其中 1 i j K 最大子列和 则被定义为所有连续子列元素的和中最大者 例如给定序列 2 1 3 4 1