zoukankan      html  css  js  c++  java
  • Leetcode 209. 长度最小的子数组 双指针

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

    给定一个含有 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)) 时间复杂度的解法。
    

    解答
    使用两个指针l r记录尝试的区间,查看该区间的和是否满足大于等于target
    如果大于等于target 则尝试缩小区间,得到最短区间。
    如果小于target 则尝试扩大区间 尝试区间和大于等于target
    如图
    image

    class Solution {
    public:
    	int minSubArrayLen(int target, vector<int>& nums) {
    		int l = 0; int r = 0;
    		int sum = nums[l]; int ans = 999999;
    		while (l < nums.size() && r < nums.size()) {
    			if (sum >= target) {
    				ans = min(r - l + 1, ans);
    				if (l == r) return ans;
    				sum -= nums[l]; l++;
    			}
    			else {
    				r++; 
    				if (r >= nums.size()) break;
    				sum += nums[r];
    			}
    		}
    		cout << "ans 1 = " << ans << endl;
    		if (ans == 999999)ans = 0;
    
    		return ans;
    	}
    };
    
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    ILM --interface logic model
    dbGet net trace instant pin
    LIST 列表
    Getopt::Long
    TCL Strings
    MBA 报考
    英语 口译考试
    微服务了解
    解析微服务架构(三):微服务重构应用及IBM解决方案
    解析微服务架构(二):融入微服务的企业集成架构
  • 原文地址:https://www.cnblogs.com/itdef/p/15196619.html
Copyright © 2011-2022 走看看