这是悦乐书的第154次更新,第156篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第13题(顺位题号是53)。给定一个整数数组nums,找出一个最大和,此和是由数组中索引连续的元素组成,至少包含一个元素。例如:

输入:[-2, 1, -3, 4, -1, 2, 1, -5,4]
输出:6
说明:[4,-1,2,1]具有最大的和为6

输入:[1, 2, 3]
输出:6
说明:[1, 2, 3]具有最大的和为6

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

因为本题最后输出的是最大值,所以需要进行求和,并且要从第一位元素开始,依次和相邻元素相加来判断。

第一次循环,得到数组第一个元素,与0相加,此时最大值是元素本身。

第二次循环,得到数组第二个元素,与第一个元素相加,此时相加的和需要先判断是否大于第二个元素本身,因为如果两个数的和还没有本身大,那么此时最大和就是第二个元素本身。其次,还要和上一个和判断,如果大于第一次循环得到的和,那么新的最大和即为第一个元素和第二个元素之和或者第二个元素本身;反之最大和依旧是第一次循环后的最大和。

后面的循环与上面一致,最开始第一次的循环也是如此,为了方便对比,只是详细说明了第二次循环的处理逻辑。

public int maxSubArray(int[] nums) {int sum = 0;int max = Integer.MIN_VALUE;for (int i = 0; i < nums.length; i++) {sum += nums[i];if (nums[i] > sum) {sum = nums[i];}if (sum > max) {max = sum;}}return max;
}

对于上面的代码,我们还可以再简化下。

public int maxSubArray2(int[] nums) {int result = Integer.MIN_VALUE;int sum = 0;for (int i = 0; i < nums.length; i++) {sum = Math.max(nums[i] + sum, nums[i]);result = Math.max(result, sum);}return result;
}

03 第二种解法

还有一种思路,就是分而治之,将大问题拆分成小问题,找到小问题的答案后,最后合在一起再得出最后的答案。下面的代码是讨论区里某位大神的,可以好好看下。

public int maxSubArray3(int[] a) {return helper(a, 0, a.length - 1);
}int helper(int[] a, int l, int r) {if(l > r) return Integer.MIN_VALUE;if(l == r) return a[l];int mid = l + (r - l)/2;return Math.max(crossMidMax(a, l, r), Math.max(helper(a, l, mid - 1), helper(a, mid + 1, r)));
}int crossMidMax(int[] a, int l, int r) {int mid = l + (r - l)/2;int lmax = a[mid], lg =  a[mid];for(int i = mid -1; i >= l; i--) {lmax += a[i];lg = Math.max(lmax, lg);}int rmax = a[mid], rg =  a[mid];for(int i = mid +1; i <= r; i++) {rmax += a[i];rg = Math.max(rmax, rg);}return lg + rg - a[mid];
}

04 小结

今天此题涉及的分而治之算法,会写在后面的算法和数据结构的理论知识介绍中,研究透彻了再和各位分享。以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/9864536.html

【算法】LeetCode算法题-Maximum Subarray相关推荐

  1. 面试算法LeetCode刷题班—BAT面试官带你刷真题、过笔试

    课程名称: <面试算法LeetCode刷题班> --BAT面试官带你刷真题.过笔试 主讲老师: 林老师 BAT资深研发工程师(T7/P8级),致力于搜索引擎及其子系统的研发.迭代与优化,数 ...

  2. python基础刷题_数据结构与算法LeetCode刷题(Python)

    参考资料: 一.链表 1.  链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2.  链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...

  3. 零基础新手学习算法Leetcode刷题指南

    刷算法到底在刷什么?这是很多人会想不明白的.而算法为什么这么重要,今天想说下这块内容.市面上都在说不要重复造轮子,这里说的不是你在一开始就不造轮子. 我们学习成长的过程是,先模仿,后改造,最终创新.所 ...

  4. 【LeetCode】053. Maximum Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  5. 如何判断链表中是否存在环?Floyd判圈算法 leetcode刷题笔记 142. 环形链表 II

    这道题使用了floyd判圈算法,所以先讲解floyd算法的原理和实现,最后在附加上第142题的代码. floyd算法: 一.用途: 可以在有限状态机.迭代函数或者链表上判断是否存在环,求出该环的起点与 ...

  6. 基础夯实,字节内部总结240道算法LeetCode刷题笔记,直呼太全

    1.什么是算法 算法(algorithm,[ˈælɡərɪðəm],计算程序):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出.简单来说算法就是一系列的计算步骤,用来将 ...

  7. Python HackerRank 刷题 Maximum Subarray Sum

    题目地址: https://www.hackerrank.com/challenges/maximum-subarray-sum/problem?isFullScreen=false 简述:在给定正整 ...

  8. C#LeetCode刷题-分治算法

    分治算法篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...

  9. Leetcode算法题-解法转载

    版权声明:本文为博主原创文章,未经博主允许不得转载.    https://blog.csdn.net/fuxuemingzhu/article/details/85112591 作者: 负雪明烛 i ...

最新文章

  1. 福利 | 如何创造可信的AI?人工智能大牛盖瑞·马库斯的11条建议
  2. 在VS2010平台上创建并使用dll
  3. pytorch 查看当前学习率_pytorch调整模型训练的学习率
  4. 【网络安全】反序列化漏洞底层扩展与制作WebShell
  5. mycat和应用程序集成_企业应用程序集成简介
  6. SSM整合(二)(mybatis逆向工程)
  7. Python爬上不得姐 并将段子写入数据库
  8. 7-110 自动售货机 (30 分)
  9. windows超级工具AlantopTool
  10. chrome浏览器小恐龙自动跑
  11. 【小程序精品源码系列】小说阅读器
  12. S5P4418裸机开发(一):相关工具准备
  13. 探秘BOF 和EOF
  14. 一文详解被阿里腾讯视作核心机密的大数据平台架构
  15. forwarding
  16. iOS 系统方法获取当前位置经纬度
  17. RxJS——异步数据流的响应式编程库(适合新手入门)
  18. 苹果手机打电话没有声音怎么回事_网页看视频没有声音怎么回事?
  19. android6.0新权限申请以及RxPermissions库的使用
  20. ERR! configure error gyp ERR! stack Error: Can't find Python executable python

热门文章

  1. ux和ui_我怎么知道UI / UX是否适合我?
  2. ux设计_为企业UX设计更好的数据表
  3. 苹果风格ui_苹果如何使Soft-UI成为未来
  4. 从Vue.js源码中我学到的几个实用函数
  5. leetcode 207课程表
  6. selenium界面元素定位
  7. FastReport使用方法(C/S版)
  8. 多语言报表的改动方法
  9. 前端每隔几秒发送一个请求
  10. 关于volatile(转)