龙空技术网

算法:长度最小的子数组(Java版)

Java破局者 54

前言:

现时大家对“java数组最小值为”大约比较关注,看官们都需要知道一些“java数组最小值为”的相关知识。那么小编同时在网摘上收集了一些关于“java数组最小值为””的相关资讯,希望你们能喜欢,姐妹们快快来了解一下吧!

长度最小的子数组是一个经典的算法问题,通常描述为:给定一个整数数组和一个目标值,找到数组中和为目标值的最短非空子数组的长度。如果不存在这样的子数组,则返回0。

暴力解法

暴力解法是通过两层循环遍历所有可能的子数组,然后检查它们的和是否等于目标值。

首先,我们固定子数组的起始位置 i = 0,然后遍历所有可能的结束位置 j(从 i 到数组末尾)。对于每个结束位置 j,我们计算子数组的和 sum如果 sum 等于 target,我们更新最小长度 minLen如果 sum 大于 target,则无需继续向后遍历,因为增加更多的元素只会使和更大。重复步骤1-4,直到遍历完所有可能的起始位置 i

Java代码示例:

public int minSubArrayLen(int target, int[] nums) {    int minLen = Integer.MAX_VALUE;    int sum = 0;        for (int i = 0; i < nums.length; i++) {        sum = 0;        for (int j = i; j < nums.length; j++) {            sum += nums[j];            if (sum == target) {                minLen = Math.min(minLen, j - i + 1);            } else if (sum > target) {                break; // 如果当前子数组的和已经大于目标值,则无需继续向后遍历            }        }    }        return minLen == Integer.MAX_VALUE ? 0 : minLen;}

时间复杂度:O(n^2),其中n是数组的长度。因为有两层循环,每层循环最多执行n次。

空间复杂度:O(1),只使用了几个变量来存储中间结果,没有使用与数组长度相关的额外空间。

滑动窗口法

滑动窗口法是一种更高效的解法,它使用双指针(或称为滑动窗口)来维护一个子数组,通过移动指针来调整子数组的范围,同时记录子数组的和。

我们初始化两个指针 leftright,都指向数组的起始位置。我们用一个变量 sum 来记录当前窗口内元素的和。我们移动右指针 right,同时累加元素到 sum 中,直到 sum 大于或等于 targetsum 大于或等于 target 时,我们尝试缩小窗口(即移动左指针 left),同时从 sum 中减去左指针指向的元素,直到 sum 小于 target在每次移动左指针时,我们都检查当前窗口的长度(即 right - left + 1)是否小于 minLen,并更新 minLen 如果需要。重复步骤3-5,直到右指针 right 遍历完整个数组。

Java代码示例:

public int minSubArrayLen(int target, int[] nums) {    int left = 0, sum = 0, minLen = Integer.MAX_VALUE;        for (int right = 0; right < nums.length; right++) {        sum += nums[right];        // 注意这里使用while,每次更新 left(起始位置),并不断比较子序列是否符合条件        while (sum >= target) {            minLen = Math.min(minLen, right - left + 1);            sum -= nums[left];            left++;//这里体现出滑动窗口的精髓之处,不断变更left(子序列的起始位置)        }    }        return minLen == Integer.MAX_VALUE ? 0 : minLen;}

时间复杂度:O(n),其中n是数组的长度。右指针right遍历数组一次,左指针left最多也遍历数组一次。

空间复杂度:O(1),只使用了几个变量来存储中间结果,没有使用与数组长度相关的额外空间。

总结

暴力解法简单直观,但时间复杂度较高,不适合处理大规模数据。滑动窗口法则通过双指针技巧优化了时间复杂度,是一种更高效的解法。在实际应用中,通常推荐使用滑动窗口法来解决这类问题。

标签: #java数组最小值为 #java数组求最小值