算法 简单 | 44. 最小子数组

这是一篇关于算法的博客,主要探讨如何在整数数组中找到具有最小和的连续子数组。文章通过题目描述、样例解释以及Java、C++、Python三种语言的解题思路,详细阐述了解决这一问题的方法。

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

算法 简单 | 44. 最小子数组

题目描述

给定一个整数数组,找到一个具有最小和的连续子数组。返回其最小和。

样例1

输入:[1, -1, -2, 1]
输出:-3

样例2

输入:[1, -1, -2, 1, -4]
输出:-6

java题解

定义两位数组
第一个比较大小确定当前位置的元素能否为sunArray的起点
第二个记录前 i 个元素能构成sunArray的最小和

public class Solution {
    public int minSubArray(List<Integer> nums) {
        // write your code here
        if (nums == null || nums.size() == 0) {
            return 0;
        }
        int n = nums.size();
        int []localMin = new int[n]; 
        int []golbalMin = new int[n];
        localMin[0] = golbalMin[0] = nums.get(0);
        for(int i = 1; i < n; i++){
            localMin[i] = Math.min(localMin[i - 1] + nums.get(i), nums.get(i)); //比较判断是否从一个新的元素开始找SubArray
            golbalMin[i] = Math.min(golbalMin[i - 1], localMin[i]);// 前 i 位元素可以构成的最小subArray之和
        }
        return golbalMin[n - 1];
    }

C++题解

思路类似
优化空间的做法

using namespace std;

class Solution {
public:
    int minSubArray(vector<int> nums) {
        int minSum = nums[0];  // 初始化minSum
        int sum = 0;  
        int maxSum = 0;

        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
            if (sum - maxSum < minSum) {
                minSum = sum - maxSum;  //minSum记录前 i 位元素能够成的最小subArray之和
            }
            if (sum > maxSum) {   // 因为nums中有负数,所以某一段subArray的sum超过0,则舍弃,重置为0
                sum = maxSum;
            }
        }
        return minSum;
    }
};

python题解

做法和 C++ 类似

class Solution:
    def minSubArray(self, nums):
        sum = 0
        minSum = nums[0]
        maxSum = 0
        for num in nums:
            sum += num
            if sum - maxSum < minSum:
                minSum = sum - maxSum
            if sum > maxSum:
                maxSum = sum
        return minSum
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值