【迎战蓝桥杯】 算法·每日一题(详解+多解)-- day7

简介: 【迎战蓝桥杯】 算法·每日一题(详解+多解)-- day7

【迎战蓝桥杯】 算法·每日一题(详解+多解)-- day7


✨博主介绍

和大于等于 target 的最短子数组

解题思路

💫点击直接资料领取💫


✨博主介绍

🌊 作者主页:苏州程序大白


🌊 作者简介:🏆CSDN人工智能域优质创作者🥇,苏州市凯捷智能科技有限公司创始之一,目前合作公司富士康、歌尔等几家新能源公司


💬如果文章对你有帮助,欢迎关注、点赞、收藏


💅 有任何问题欢迎私信,看到会及时回复

💅关注苏州程序大白,分享粉丝福利


和大于等于 target 的最短子数组


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


进阶:


进阶:
如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。


解题思路


双指针


采用双指针的方式,i不停的向前走,知道sum>=target。


当sum


当sum==target的时候记录下此时的子数组个数res,并使得i++。


当sum>target是,start++,保持i不动,也记录下此时的res(取最小值)。


时间复杂度O(N), 空间复杂度O(1)


class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0;
        int n=nums.length;
        int res = 0;
        int i=0, start=0;
        while (i<n){
            int cur = sum+nums[i];
            if (cur<target){
                sum += nums[i];
                i++;
            }else if (cur==target){
                sum += nums[i];
                if (res!=0) res = Math.min(res, i-start+1);
                else res = i-start+1;
                i++;
            }else {
                if (res!=0) res = Math.min(res, i-start+1);
                else res = i-start+1;
                sum -= nums[start];
                start++;
            }
        }
        return res;
    }
}


优化


思路与前面大致是一样的,但是更简化


时间复杂度O(N), 空间复杂度O(1)


class Solution {
        public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        int ans = Integer.MAX_VALUE;
        int sum = 0;
        int left = 0, right = 0;
        while (right < n) {
            sum += nums[right++];
            while (sum >= target) {
                ans = Math.min(ans, right - left);
                sum -= nums[left++];
            }
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}


前缀和+二分查找


由于数组中元素都是正数,所以前缀和数组为递增数组,可以使用二分法进行查找。


基于数组获得前缀和数组,数组nums的长度为n,为了方便计算,前缀和数组sums长度为n+1,sums[0]=0表示前0个数的和为0,sums[i]表示前i个数的和,sums[i]=nums[0]+nums[1]+……+nums[i-1]。构造前缀和数组的时间复杂度为O(n)。


nums数组中连续数字的和大于等于target,等价于sums数组中sums[j]-sums[i]>=target。


要找到最短连续字数组,首先遍历固定一个数字sum[i],时间复杂度O(n)。


再在i后面的数中找到一个数sums[j],保证nums[j]>=nums[i]+target且j最小。连续数组找大于或等于目标值的数字,采用二分法,时间复杂度O(nlgn)。


时间复杂度:O(n)+O(nlgn)=O(nlgn) 空间复杂度:O(n)


public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        int minLen = Integer.MAX_VALUE;
        int[] sums = new int[n + 1];//前缀和数组,sums[0] = 0,sums[i]为前i个数的和
        for(int i = 1; i <= n; i++) sums[i] = sums[i - 1] + nums[i - 1];
        // sums[j]-sums[i] >= target
        for(int i = 0; i < n; i++){
            int num = target + sums[i];
            int j = Arrays.binarySearch(sums, num);//如果数组中存在num,返回索引;如果不存在,返回-(插入索引+1)
            if(j < 0) j = -j-1;//找到大于num的最小位置
            if(j <= n) minLen = Math.min(minLen, j - i);
        }
        return minLen == Integer.MAX_VALUE ? 0 : minLen;
    }



相关文章
|
5月前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
624 6
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
477 5
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
795 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
5月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
513 0
|
5月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
339 2
|
6月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
312 3
|
5月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
264 8
|
5月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
302 8