力扣 209. 长度最小的子数组

1、原始题目链接

https://leetcode-cn.com/problems/minimum-size-subarray-sum/

2、思路分析

题目的要求是找到刚好大于或者等于阈值的子数组的元素个数;
进行两层遍历,在遍历的时候,i 为子数组的起始位置 j 为子数组的结束位置;

  • 第一层循环保证所有的数字都作为子数组的起始位置;
  • 第二层循环,保证所有的数字都作为子数组的结束位置;
  • 当 sum 刚好大于等于阈值的时候,说明找到了一个子数组,至于是不是长度最小的子数组需要下面的判断;
  • 判断:如果此次的起始终止中间的数字长度小于以前的最小子数组长度,更新子数组并且长度将循环退出来(更新是为了始终得到最下的子数组);

3、基于暴力破解的寻找数组的最小子数组代码实现

public class 创建长度最小的子数组 {
    // 设置 32 位的最大值
    public static int INT32_MAX = 2147483647;

    /**
     *传递数组,阈值,找到最小的子数组
     * @param nums   寻找长度最小的子数组的原始数组
     * @param s    寻找最小的子数组的阈值
     * @return
     */
    public static int minSubArrayLen(int[] nums, int s) {
        int result = INT32_MAX; // 最终的结果
        int sum = 0; // 获取到的子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.length; i++) { // 设置子序列起点为i
            sum = 0;
            for (int j = i; j < nums.length; j++) { // 设置子序列终止位置为j
                sum += nums[j];     // 刚开始的 j = i 都是 0 ,i 保持不动,j 进行移动,寻找刚好大于目标数值的最小子序列
                if (sum >= s) { // 一旦发现子序列和超过了s,更新result
                    subLength = j - i + 1; // 取子序列的长度 终止的减去开始的就是数字之间的间隔,间隔加一就是数字的个数,一个间隔但是存在两个数字
                    result = result < subLength ? result : subLength;   //  始终选取比较小的 满足结果的数量
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result; // 三目运算符,比较得到的结果
    }

    public static void main(String[] args) {
        int[] nums = {2, 3, 1, 2, 4, 3};

        int length = minSubArrayLen(nums, 7);
        int length1 = minArrayLen(nums, 7);
        System.out.println("长度最小的子数组中包含的元素个数为:" + length);
        System.out.println("长度最小的子数组中包含的元素个数为:" + length1);
    }

    /**
     *传递数组,阈值,找到最小的子数组
     * @param arr   寻找长度最小的子数组的原始数组
     * @param target    寻找最小的子数组的阈值
     * @return
     */
    public static int minArrayLen(int[] arr, int target) {
        int result = 100;
        int sum;
        int subLen = 0;

        for (int i = 0; i < arr.length; i++) {
            sum = 0;
            for (int j = i; j < arr.length; j++) {
                sum += arr[j];
                if (sum >= target) { // 注意找到的最小的子数组,这里是有等于号的,在实际中需要注意
                    subLen = j - i + 1;
                    result = result < subLen ? result : subLen;
                    break;
                }
            }
        }
        return result;
    }
}

4、基于滑动窗口法得到最小子数组长度(后期制作)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值