《程序员面试金典(第6版)》面试题 16.17. 连续数列(贪心算法思想,动态规划算法思想,C++)

news2024/12/23 10:37:59

题目描述

给定一个整数数组,找出总和最大的连续数列,并返回总和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

进阶:

  • 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

解题思路与代码

  • 首先,这道题是一道稍微有点难度的简单题。需要同学们对贪心算法思想与动态规划算法思想有一点基础的了解。做这道题就会非常的简单。

  • 反之,可能会有点难。有可能你做出这道题后,你都不知道你使用的方法是贪心还是动态规划。

这道题题目的进阶说是可以使用分治算法去求解。我看了看,感觉实在是没有必要。因为,这只是道简单题。动态规划和贪心已经可以了。而分治呢,有一种舍近求远的感觉,还把这道题上升到了另一个高度。复杂度也比这两种的实现要高。所以,我真心觉得没有必要。所以也就不去做这个实现了。

方法一:贪心算法思想

  • 我做这道题的时候,我先是假定这道题里面的数组里面的数字,是有正有负的一个序列。
    • 那么我写的这个实现,前半部分就是试图在整个数组中,找到总和最大的连续数列,并返回总和。我用一个for循环与两个变量去实现这个算法。
    • 在遍历数组过程中,每次都选择使得当前连续子数组和 count 大于零的元素。当遇到使得 count 之和小于零的元素时,就选择跳过这个元素,重新开始累加。
  • 后来发现,这道题中,竟然有全都是负数的情况,那全都是负数我该怎么办呢?那当然是返回最小的那个负数了。
  • 最后返回结果即可

具体代码如下:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int count = 0;
        int result = 0;
        for(int i = 0; i < nums.size(); ++i){
            if(count + nums[i] < 0) {
                count = 0;
                continue;
            }
            count += nums[i];
            result = max(count,result);
        }
        if(result == 0){
            result = nums[0];
            for(int i = 1; i < nums.size(); ++i)
                result = max(result,nums[i]);
        }
        return result;
    }
};

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

方法二:优化:动态规划思想

  • 相比与上一种的贪心算法思想,我觉得我这一种动态规划思想会使代码看的更有简介,并且效率更高。因为我优化掉了一个for循环。
  • 这个算法的思路是,从数组的第二个元素开始遍历,每次更新 currNum 为当前元素与 currNum 加上当前元素的较大值。
  • 这样一来,我们可以确保 currNum 始终是一个可能的连续子数组的和。
  • 然后我们将 maxNum 更新为 currNum 和 maxNum 中的较大值,这样我们就可以在遍历过程中找到最大的连续子数组和。

具体代码如下:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int currNum = nums[0]; 
        int maxNum = nums[0];
        for(int i = 1; i < nums.size(); ++i){
            currNum = max(nums[i],currNum + nums[i]);
            maxNum = max(currNum,maxNum);
        }
        return maxNum;
    }
};

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

总结

这道题目(求最大连续子数组和)的意义在于:

  • 算法设计思路:这道题目提供了一个平台,让我们可以学习和探讨不同的算法设计思路,例如贪心算法、动态规划和分治法。通过比较和分析这些方法的优缺点,我们可以更好地理解这些算法设计思路及其应用场景。

  • 问题求解能力:解决这类问题可以锻炼我们的问题分析和解决能力。通过思考问题,我们学会将问题拆解成更小的子问题,然后寻找合适的方法将这些子问题的解合并成原问题的解。这种能力在实际编程工作中非常重要。

  • 代码实现技巧:编写不同解法的代码可以提高我们的编程技巧。例如,在实现动态规划解法时,我们需要考虑状态的表示和状态转移方程;在实现分治法时,我们需要掌握递归的技巧以及如何合并子问题的解。这些技巧都是编程过程中必备的能力。

  • 优化性能:这道题目也强调了优化算法性能的重要性。在实际应用中,我们往往需要在有限的时间和空间资源下求解问题。通过对比不同算法的时间复杂度和空间复杂度,我们可以更好地了解如何在实际问题中选择合适的算法。

总之,这道题目具有一定的教育意义和实际应用价值。通过学习和掌握这类问题的解决方法,我们可以提高自己的算法设计、问题求解和编程能力。

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

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

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

相关文章

elementUI tabs切换 echarts宽度挤压到一起 由100%变成100px

被压缩的图表&#xff1a; 正常显示 <el-tabs v-model"activeName" type"card" tab-click"handleClick"><el-tab-pane name"first"></el-tab-pane><el-tab-pane name"second" label"未达成原因…

如何在Kali Linux中获得root权限?

根用户名或账户在Linux或任何其他类似Unix的操作系统中拥有所有可用命令和文件的默认权限。它也被称为超级用户、根账户和根用户。用户名&#xff1a;"kali "是登录新Kali系统的标准凭证。这建立了一个用户 "kali "的会话&#xff0c;你必须在 "Sudo …

Java—JDK8新特性—方法引用【内含思维导图】

目录 4.方法引用 思维导图 4.1 什么是方法引用 4.2 为什么要使用方法引用 4.3 方法引用语法 4.4 方法引用的5种情况使用示例 4.方法引用 思维导图 4.1 什么是方法引用 方法引用就是Lambda表达式&#xff0c;也就是函数式接口的一个实例&#xff0c;通过方法的名称来指向一…

Word怎么分页,提高效率就靠这3种方法!

案例&#xff1a;Word怎么分页 【文档要进行分页处理&#xff0c;但是我尝试了好多次还是不行&#xff01;大家知道Word怎么分页吗&#xff1f;】 在使用Microsoft Word处理文档时&#xff0c;我们常常需要进行分页操作。Word的分页功能可以将文档分成多个页面&#xff0c;以…

【Vue3 插件篇】GSAP 动画库与 图片预览插件

GSAP 动画库 GSAP&#xff08;GreenSock Animation Platform&#xff09;是一个专业的动画库&#xff0c;可以用它完成你想要的各种效果 官网地址&#xff1a;https://greensock.com/ 参考文章一&#xff1a;https://www.jianshu.com/p/a8e150f0e569 参考文章二&#xff1a…

利用MQ事务消息实现分布式事务

MQ事务消息使用场景 消息队列中的“事务”&#xff0c;主要解决的是消息生产者和消息消费者的数据一致性问题。 拿我们熟悉的电商来举个例子。一般来说&#xff0c;用户在电商 APP 上购物时&#xff0c;先把商品加到购物车里&#xff0c;然后几件商品一起下单&#xff0c;最后…

为游客提供完美旅程:携程集团携手亚马逊云科技联合创新

刚刚过去的“五一”假期&#xff0c;旅游行业展现出了强劲的复苏势头。经文化和旅游部数据中心测算&#xff0c;全国国内旅游出游合计2.74亿人次&#xff0c;同比增长70.83%。 然而&#xff0c;出行前的航班高铁订票、酒店商旅预订、出游行程安排&#xff0c;就已经让不少家庭为…

C++linux高并发服务器项目实践 day9

Clinux高并发服务器项目实践 day9 信号集信号集相关函数以下信号集相关的函数都是对自定义的信号集进行操作sighandler_t函数sigaction函数 SIGCHLD信号共享内存共享内存使用步骤共享内存操作函数 信号集 许多信号相关的系统调用都需要能表示一组不同的信号&#xff0c;多个信…

深度思考:在 AI 时代,你会被放大一千倍的能力是什么?

Datawhale干货 作者&#xff1a;艾芙&#xff0c;复旦大学&#xff0c;百姓AI教育负责人 前言 大家晚上好&#xff0c;我是艾芙&#xff0c;百姓 AI 的 AI 教育负责人。 先做一下自我介绍&#xff0c;我是一个在技术圈和教育圈反复横跳的斜杠中年了。大约在 5 年前&#xff0c…

C++格式输入输出

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;数据结构 &#x1f525;座右铭&#xff1a;“不要等到什么都没…

常用的数据中心部署架构

说起数据中心&#xff0c;相信大家并不陌生。随着互联网行业的蓬勃发展&#xff0c;大数据时代的快速到来&#xff0c;数据中心同我们的生活紧密联系&#xff0c;息息相关。我们日常生活中的各种数据几乎都存储在数据中心里&#xff0c;例如&#xff1a;手机照片的云端备份、放…

Python小姿势 - # Python相关技术知识点

Python相关技术知识点 标题 在Python中如何处理文件 如果你要处理文件&#xff0c;那么在Python中你需要使用到os模块中的一些方法。 首先&#xff0c;你需要使用os.path.exists方法来判断文件是否存在&#xff1a; python if os.path.exists(file.txt): print(文件存在) else:…

asp.net企业员工考勤管理系统

企业员工管理系统主要是为企业内部管理员工使用的&#xff0c;主要功能分为员工和管理员两部分&#xff0c;主要的功能有用户登录&#xff0c;管理员信息管理&#xff0c;公告信息管理&#xff0c;文件审批管理&#xff0c;员工信息管理&#xff0c;工资信息管理&#xff0c;奖…

全景丨0基础学习VR全景制作,平台篇第19章:热点功能-文本

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01; 功能说明 应用场景 热点&#xff0c;指在全景作品中添加各种类型图标的按钮&#xff0c;引导用户通过按钮产生更多的交互&#xff0c;增加用户的多元化体验。 文本热点&#xff0c;即点击热点后会弹出…

一顿饭的事儿,搞懂了Linux5种IO模型

大家好&#xff0c;我是老三&#xff0c;人生有三大难题&#xff0c;事业、爱情&#xff0c;和 ——这顿吃什么&#xff01; 人在家中躺&#xff0c;肚子饿得响&#xff0c;又到了不得不吃的时候&#xff0c;这顿饭该怎么吃&#xff1f;吃什么呢&#xff1f; Linux里有五种I…

【笔记】【HTTP】《图解HTTP》第1章 了解Web及网络基础

前言 有输入就要有产出&#xff0c;该笔记是本人看完《图解HTTP》后对每章涉及到的知识进行汇总博客将会已书的每章为一篇发布&#xff0c;下一篇博客发布时间不确定笔记中有些个人理解后整理的笔记&#xff0c;可能有所偏差&#xff0c;也恳请读者帮忙指出&#xff0c;谢谢。…

在Notion AI 中轻松打造您的AI私人助理,提供卓越的工作体验

大家好&#xff0c;我是瓜叔。 相信平时喜欢做笔记的人对notion 选应该不陌生近年来越来越多人开始把notion 选当做他们的主力笔记软件。 我自己也用了约4年的时间。如果你也是notion的爱好者但还不知道notion AI是什么。那这篇文章&#xff0c;我会分享我是如何实际操作使用技…

Windows terminal+wsl+ohmyzsh+powerlevel10k打造更美丽的终端

安装wsl 安装 WSL 和 Linux 的默认 Ubuntu 发行版。 了解详细信息https://learn.microsoft.com/zh-cn/windows/wsl/install。 还可以使用此命令通过运行 wsl --install 来安装其他 Linux 发行版。 若要获取发行版名称的有效列表&#xff0c;请运行 wsl --list --online。 wsl -…

AIOps探索 | 新形势下,中小银行如何学好数字化转型“必修课”?

一、强化数智驱动 推进转型升级 2023年4月21日&#xff0c;在江苏省支付清算服务协会、山东省支付清算协会的大力支持下&#xff0c;由金科创新社&#xff08;鑫知&#xff09;主办的“2023农村中小银行数字化转型研讨会”在江苏南京成功举办。 ​本次大会以“强化数智驱动 推…

深入浅出堆—C语言版【数据结构】

二叉树概念博客&#xff1a;http://t.csdn.cn/XIW84 目录 1. 了解堆 1.1 堆的概念 1.2 堆的性质&#xff1a; 1.3 堆的结构图片 1.3.1 小堆 1.3.2 大堆 2. 堆的实现 2.1 插入数据进堆 2.2 向上调整函数 2.3 堆的删除 2.4 向下调整 3. 堆的应用 3.1 建堆&#xff…