53. 最大子数组和(力扣-java)

该问题求解的是给定一个整数数组,找到其中连续子数组的最大和。两种解决方案分别使用了滚动变量和动态规划的方法,通过遍历数组并计算当前子数组的和与历史最大和的关系来更新最大和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。

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

示例 2:
输入:nums = [1]
输出:1

示例 3:
输入:nums = [5,4,-1,7,8]
输出:23

提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104

思路:以下列代码第一种为例
(1)先用sum(起始为num[0])记录前 i-1 个元素中连续子数组最大和,即记录是否对第 i 个数据是否有增益。
(2)当sum>0时,说明 i 位置前面连续子数组值和为正,则 对于i 位置数据是有增益的,如果没有增益直接pass,令sum = nums[i]

(可能有的人不明白为什么令sum = nums[i],举个例子:当增益sum = -1,nums[i] = 2,nums[i]加上增益sum肯定变小了,那不如直接让sum为nums[i])使得比sum = sum + nums[i](sum = -1 + 2 = 1)更大

(3)max默认最大增益为nums[0],将sum与max比较,较大的增益复制给max,最后返回max
代码:

//第一种:
class Solution {
public int maxSubArray(int[] nums) {
        int sum = nums[0];
        //首先默认首元素为和最大值
        int max = nums[0]; 
        for(int i = 1; i < nums.length;i++){
            //如果当前i位置的前i-1个数和>0
            //则说明此时对该位置数有增益
            if(sum > 0){
                sum = sum + nums[i];
            }else {//如果为负数,则会使当前数字减小,则最大的还是当前数字
                sum = nums[i];
            }
            max = Math.max(sum,max);
        }
        return max;
    }
}

//第二种
class Solution {
     public int maxSubArray(int[] nums){
         int[] dp = new int[nums.length];
         dp[0] = nums[0];
         int max = nums[0];
         for(int i = 1; i < nums.length;i++){
         //dp[i]记录前i-1个数据中连续子数据中最大值
            dp[i] =Math.max( dp[i-1] + nums[i],nums[i]);
            max = Math.max(dp[i],max);
         }
          return max;
     }
 }



### 常见的Java LeetCode题目类型及解题思路 #### 题目类型概述 LeetCode上的Java题目涵盖了多种算法数据结构的应用场景,主要包括数组操作、字符串处理、链表管理、树遍历以及动态规划等问题。以下是几种常见类型的描述: - **数组与矩阵**:涉及查找最大子序列、旋转图像等任务。 - **字符串匹配与编辑距离**:如判断回文串、计算两个字符串之间的最小编辑次数。 - **链表操作**:反转单向/双向链表节点顺序或者检测环形结构的存在与否。 - **二叉树及相关概念**:前序、中序、后序遍历;平衡判定;路径总求解等等。 #### 示例一:两数之 (Two Sum) 给定一个整型数组`nums` 目标值 `target`, 找到数组中的两个不同位置 i,j 的元素使得它们相加等于 target, 返回这两个索引[i,j]. ```java public int[] twoSum(int[] nums, int target){ Map<Integer,Integer> map=new HashMap<>(); for(int i=0;i<nums.length;i++){ if(map.containsKey(target - nums[i])){ return new int[]{map.get(target - nums[i]),i}; } map.put(nums[i],i); } throw new IllegalArgumentException("No solution"); } ``` 此方法利用哈希映射来存储已经访问过的数值及其对应的下标,在后续迭代过程中快速定位是否存在满足条件的一对数字[^1]。 #### 示例二:最长公共前缀(Longest Common Prefix) 编写函数找出多个输入字符串列表中最长共有的起始部分。如果不存在这样的共同开头,则返回空字符"". ```java public String longestCommonPrefix(String[] strs) { if(strs==null||strs.length==0)return ""; String prefix=strs[0]; for(int i=1;i<strs.length;i++) { while(strs[i].indexOf(prefix)!=0){ prefix=prefix.substring(0,prefix.length()-1); if(prefix.isEmpty())return ""; } } return prefix; } ``` 通过逐步缩短候选词长度直至找到所有单词都共享的部分作为最终结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值