zoukankan      html  css  js  c++  java
  • LeetCode刷题-- 长度最小的子数组

    LeetCode刷题-- 长度最小的子数组

    一、题目

    给定一个含有 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

    提示:1 <= target <= 109;1 <= nums.length <= 105;1 <= nums[i] <= 105

    二、题解

    第一种解法: 通过两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2) 。

    第二种解法: 通过滑动窗口的原理,不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

    image-20210422214433388

    三、代码

    public class _03_长度最小的子数组 {
    
        /**
         * 1. 暴力解法
         * @param target
         * @param nums
         * @return
         */
        public static  int minSubArrayLen(int target, int[] nums) {
            int result = Integer.MAX_VALUE;
            int sum = 0;
            int subLen = 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){
                        subLen = j-i+1;
                        result = subLen < result ? subLen : result;
                        break;
                    }
                }
            }
            return Integer.MAX_VALUE == result ? 0 : result;
        }
    
        /**
         * 2. 滑动窗口
         * @param target
         * @param nums
         * @return
         */
        public static  int minSubArrayLen2(int target, int[] nums) {
            int result = Integer.MAX_VALUE;
            int sum = 0;
            int subLen = 0;
            int i = 0;
    
            for (int j = 0; j <nums.length; j++) {
                 sum += nums[j];
                 while(sum >= target){
                     subLen = j - i + 1;
                     result = subLen < result ?  subLen : result;
                     sum -= nums[i++];
                 }
            }
            return result == Integer.MAX_VALUE ? 0 : result;
        }
        public static void main(String[] args) {
            int [] nums = {2,3,1,1,4,3};
            int target = 8;
    
    
            System.out.println(minSubArrayLen2(target,nums));
        }
    }
    

    四、时间负载度和空间复杂度

    暴力法: 时间复杂度O(n^2) ,空间复杂度O(1)
    滑动窗口法:时间复杂度O(n) ,空间复杂度O(1)

  • 相关阅读:
    AtCoder Grand Contest 015 题解
    AtCoder Grand Contest 014 题解
    AtCoder Grand Contest 013 题解
    AtCoder Grand Contest 012 题解
    AtCoder Grand Contest 011 题解
    AtCoder Grand Contest 010 题解
    AtCoder Grand Contest 009 题解
    NOIP2017 Day2 题解
    博客园主题备份
    多项式全家桶
  • 原文地址:https://www.cnblogs.com/sinlearn/p/14691710.html
Copyright © 2011-2022 走看看