From fb94e378878e1a725284b162bcc6d64e1c1b9e03 Mon Sep 17 00:00:00 2001 From: Wonder Date: Wed, 1 Oct 2025 10:24:40 +0800 Subject: [PATCH] =?UTF-8?q?=20=F0=9F=94=84Update:=20=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=AD=90=E6=95=B0=E7=BB=84=E5=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 普通数组/1. 最大子数组和.md | 71 +++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 普通数组/1. 最大子数组和.md diff --git a/普通数组/1. 最大子数组和.md b/普通数组/1. 最大子数组和.md new file mode 100644 index 0000000..8884819 --- /dev/null +++ b/普通数组/1. 最大子数组和.md @@ -0,0 +1,71 @@ +# 最大子数组和 + +## 题目 + +给你一个整数数组 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 + + +进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。 + +## 思路 + +- 前缀和 + - `prefix` + - prefix[0] = 0 + - prefix[n]: [0, n) + - n <= nums.length +- 遍历 + - 维护更新最小 `prefix` (初始为 0) + - 当前数减去此前 `prefix`获取答案,如果答案变大,则更新 (初始化为 Integer.MIN_VALUE) + +## 代码 + +```java +class Solution { + public int maxSubArray(int[] nums) { + // Special + if (nums == null || nums.length == 0) return 0; + // Init + int len = nums.length; + int[] prefix = new int[len + 1]; + prefix[0] = 0; + // Cal: Prefix Sum + for (int i = 0; i < len; i++) { + prefix[i + 1] = prefix[i] + nums[i]; + } + // Ans + int minPrefix = prefix[0]; + int ans = Integer.MIN_VALUE; + for (int i = 1; i <= len; i++) { + ans = Math.max(ans, prefix[i] - minPrefix); + minPrefix = Math.min(minPrefix, prefix[i]); + } + + return ans; + } +} +``` \ No newline at end of file