LeetCode-209. 长度最小的子数组-Java-medium

题目链接

法一(滑动窗口)

    /**
     * 法一(滑动窗口)
     * (1)滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果
     * (2)时间复杂度:O(2*n),即O(n)
     * (3)空间复杂度:O(1)
     *
     * @param target
     * @param nums
     * @return
     */
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0, sum = 0, ans = Integer.MAX_VALUE;
        for (int right = 0; right < nums.length; right++) {
            sum += nums[right]; // 当前滑动窗口内数值之和(滑动窗口右侧向右扩展)
            while (sum >= target) {
                ans = Math.min(ans, right - left + 1); // 找到符合条件的最短滑动窗口长度
                sum -= nums[left++];  // 当前滑动窗口内数值之和(滑动窗口左侧向右收缩)
            }
        }
        return ans == Integer.MAX_VALUE ? 0 : ans; // 如果ans没有被赋值,就返回0,说明没有符合条件的滑动窗口
    }

本地测试

        /**
         * 209. 长度最小的子数组
         */
        lay.showTitle(209);
        Solution209 sol209 = new Solution209();
        int target209 = 7;
        int[] nums209 = new int[]{2, 3, 1, 2, 4, 3};
        System.out.println(target209 + " " + Arrays.toString(nums209));
        System.out.println(sol209.minSubArrayLen(target209, nums209));

版权声明:本文为qq_41829337原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。