209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
解析:
这道题目暴力解法是使用两个for循环,然后不断的寻找符合条件的子序列(注意:力扣当前更新了用例数据,此方法会导致超时)
1、优先判断不满足条件的情况,即所有元素之和小于target(示例3的情况)
2、定义最小长度,设置为最大值(Integer.MAX_VALUE)
3、写两个for循环,外层i从0开始,内层j从i开始,外层定义一个sum用来给内层循环求和
4、内层判断sum是否满足条件sum >= target,如果满足取minLength和本轮长度中的较小值
时间复杂度:O(n^2)
空间复杂度:O(1)
package com.codernav.demo.leetcode.array.minsubarraylen; import java.util.Arrays; /** * 209. 长度最小的子数组(暴力解法) * 给定一个含有n个正整数的数组和一个正整数target。 * 找出该数组中满足其和 ≥ target的长度最小的连续子数组[numsl, numsl+1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回0。 * 原文地址:https://www.codernav.com/2893.html * 更多算法详解:https://www.codernav.com */ public class Q_209 { public static void main(String[] args) { // sout:2 int[] nums = new int[]{2, 3, 1, 2, 4, 3}; System.out.println(f(nums, 7)); // sout:2 int[] nums1 = new int[]{5, 1, 3, 5, 10, 7, 4, 9, 2, 8}; System.out.println(f(nums1, 15)); // sout:0 int[] nums2 = new int[]{1, 1, 1, 1, 1, 1, 1, 1}; System.out.println(f(nums2, 11)); } private static int f(int[] nums, int target) { // 不满足条件 if (Arrays.stream(nums).sum() < target) { return 0; } // 最小长度 int minLength = Integer.MAX_VALUE; for (int i = 0; i < nums.length; i++) { // 子数组求和,直到找到和大于target的位置 int sum = 0; for (int j = i; j < nums.length; j++) { sum = sum + nums[j]; if (sum >= target) { // 上一轮长度与本次循环长度比较,取较小的 minLength = Math.min(minLength, j - i + 1); break; } } } return minLength; } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...