灵茶山艾府——滑动窗口【基础算法精讲 03】

链接:

链接: link

基本思想

当要解决的问题包含一段连续的子序列,可以考虑使用滑动窗口
在这里插入图片描述

        int left = 0;
        for(right=0; right<nums.size(); right++){
            sum += nums[right];
            while(满足或不满足条件){
                sum -= nums[left];
                left++;	//左指针右移
                //记录结果(或者下面)
            }
            //记录结果(或者上面)
        }

长度最小的子数组

找到长度最小的连续子数组,满足sum >= target

例如:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

思路:暴力双层for循环,会超时。考虑到求的是一段连续的子序列(窗口),直接套用滑动窗口模板

代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0;
        int result = nums.size()+1;
        int left = 0;
        int right = 0;
        for(right=0; right<nums.size(); right++){
            sum += nums[right];
           	//当满足条件时,移动左指针
            while(sum >= target){
                result = min(result, right-left+1);
                sum -= nums[left];
                left++;
            }
        }
        return result==nums.size()+1 ? 0:result;
    }
};

无重复字串

描述及实例:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

思路:
在这里插入图片描述

代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> mymap;
        int result = 0;
        if(s.size()<=1) return s.size();
        int left = 0;
        for(int i=0; i<s.size(); i++){
            mymap[s[i]]++;
            while(mymap[s[i]]>1){
                mymap[s[left]]--;
                left++;
            }
            result = max(result, i-left+1);
        }
        return result;
    }
};

713. 乘积小于 K 的子数组

题目描述及实例:

输入:nums = [10,5,2,6], k = 100
输出:8
解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。
需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。

思路:
在这里插入图片描述

代码:

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        if(k<=1)    return 0;
        int result = 0;
        int mul = 1;
        int left = 0;
        for(int right=0; right<nums.size(); right++){
            mul *= nums[right];
            while(mul >= k){
                mul /= nums[left++];
            }
            result += right - left + 1;
        }
        return result;
    }
};

2958. 最多 K 个重复元素的最长子数组

题目描述及实例:

输入:nums = [1,2,3,1,2,3,1,2], k = 2
输出:6
解释:最长好子数组是 [1,2,3,1,2,3] ,值 1 ,2 和 3 在子数组中的频率都没有超过 k = 2 。[2,3,1,2,3,1] 和 [3,1,2,3,1,2] 也是好子数组。
最长好子数组的长度为 6 。

思路:

代码:

class Solution {
public:
    int maxSubarrayLength(vector<int>& nums, int k) {
        unordered_map<int, int> mymap;
        int left = 0;
        int len = nums.size();
        int result = 0;
        for(int right=0; right<len; right++){
            mymap[nums[right]]++;
            while(mymap[nums[right]] > k){
                mymap[nums[left]]--;
                left++;
            }
            result = max(result, right-left+1);
        }
        return result;
    }
};

1658. 将 x 减到 0 的最小操作数

题目描述及示例

输入:nums = [1,1,4,2,3], x = 5
输出:2
解释:最佳解决方案是移除后两个元素,将 x 减到 0 。

思路:
在这里插入图片描述

代码:

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        //确定target
        int tar = 0;
        int len = nums.size();
        for(int i=0; i<len; i++){
            tar += nums[i];
        }
        tar -= x;
        //如果为负数,说明,减完都不满足;
        //如果恰好为0,说明需要全部减完。
        if(tar<0)   return -1;
        if(tar==0)  return nums.size();
        //滑动窗口
        int left = 0;
        int sum = 0;
        int result = len+1;
        for(int right=0; right<len; right++){
            sum += nums[right];
            while(sum > tar){
                sum -= nums[left++];
            }
            if(sum == tar){
                result = min(result, len-(right-left+1));
            }
        }
        return result==len+1 ? -1:result;
    }
};
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 云南茶山位于云南省曲靖市宣威市,东西跨江,北接滇池,南接大理市,是云南省茶叶的发源地,是中国著名的茶叶之乡。茶山原名叫茶城,古时候有“三茶一石”之称,即茶山、茶城两座山,加上一块大石,因此得名。茶山以其独特的茶文化、历史文化和自然风景吸引着海内外游客,是一个具有浓郁的茶文化气息的绿色旅游景点。茶山以它的深厚的文化底蕴、美丽的自然风光和独特的民族风情深受游客的喜爱。茶山的风景独特,是一个绿色的森林公园,有空旷的茶园、茶山茶山湖、茶厂、民居和古迹等,是云南省最大的茶叶生产基地。茶山有众多的历史文物,如景福寺、海拔殿、滇池殿、山西院等,历史悠久,非常值得一游。茶山也是云南省茶叶的发源地,以其独特的茶文化、历史文化和自然风景吸引着海内外游客,是一个具有浓郁的茶文化气息的绿色旅游景点。茶山还有著名的山茶花,每年的三月份到五月份是山茶花的盛开期,是观赏山茶花的最佳时机,可以看到满山遍野的山茶花,芳香四溢,令人流连忘返。茶山是一个具有独特风景和茶文化的绿色旅游胜地,可以让游客领略到古朴的茶文化,给游客留下深刻的印象。 ### 回答2: 云南茶山位于中国云南省西双版纳傣族自治州勐海县,是中国最著名的茶叶产区之一。云南茶山是云南丰富优质茶叶资源的核心地带,茶园分布在海拔1400米至1800米的山坡上,土壤肥沃,气候温暖湿润,适宜茶树生长。茶山遍布云贵高原的低海拔山地,地形起伏多变,形成了独特的茶树生态。 云南茶山以菜籽油树林下茶园为特色,这种种植模式具有独特的生态优势,能够充分利用土壤、气候和生态环境资源,为茶树提供了良好的生长环境。而菜籽油树林也可以提供树荫,保护茶树不受强光直射,并减少土壤水分的蒸发,提高茶叶品质。 云南茶山以普洱茶为代表,普洱茶是中国六大茶类之一,有着悠久的历史和独特的工艺。普洱茶的采摘、制作、贮存和饮用都有严格的要求和程序。其茶树品种主要有大叶种和中小叶种,茶叶形状多样,有饼茶、沱茶、砖茶、散茶等。普洱茶口感醇厚,香气独特,有降脂减肥、抗氧化、降压、提神醒脑等功效,深受茶叶爱好者的喜爱。 除了普洱茶,云南茶山还产出其他优质茶叶,如滇红茶、云南白草茶、黑兔毛茶等。这些茶叶在国内外市场上都有着较高的知名度和需求量。 云南茶山的旅游资源也十分丰富,茶山风光如画,茶园群山环抱,绿意盎然,吸引了大批游客前来观光和品茶。旅游者可以在茶园中亲自体验采茶和制茶的过程,了解茶叶的生产工艺和茶文化。同时,云南茶山还有许多古茶树群落,这些具有几百年甚至千年以上历史的茶树古树,是茶叶品质的保证,也是茶文化的重要组成部分。 综上所述,云南茶山作为中国茶叶产区之一,以其独特的生态环境和种植模式,优质的茶叶品种和精湛的制作工艺,以及丰富多样的旅游资源,成为茶叶爱好者和游客们不可错过的地方。云南茶山的产茶历史悠久,是中国茶文化的重要组成部分,也是云南省重要的农业和旅游产业之一。 ### 回答3: 云南茶山位于中国云南省西南部地区,是中国著名的茶叶产区之一。茶山地区地势起伏,气候多样,土壤肥沃,是茶叶生长的理想环境。 云南茶山的主要茶叶品种有普洱茶、滇红茶、云南绿茶等。普洱茶以其特殊的发酵制造技艺而闻名,色泽红润,滋味浓郁,具有良好的陈化潜力。滇红茶则为红茶中的代表,茶叶呈现红褐色,滋味醇厚,带有果香和花香气息。云南绿茶则以其嫩绿的外观、清香的口感和鲜爽的回甘赢得了众多茶叶爱好者的喜爱。 云南茶山的茶叶种植历史悠久,可以追溯到公元前2世纪左右。受益于云南独特的地理环境和气候条件,在此地茶树的生长速度较快,茶叶的品质也非常优良。茶山地区的高海拔和丰富的降水量为茶树提供了充足的水源,而茶园周围的山脉则保护了茶叶的生长环境,使其不受污染。 茶山的茶叶栽种以手工采摘为主,采摘过程中只选择嫩叶,以确保茶叶的质量和口感。采摘后的茶叶经过日光萎凋、揉捻、发酵、干燥等工序后,最终成为优质的茶叶产品。 云南茶山的茶叶不仅在国内畅销,也出口到世界各地。当地的茶叶产业为当地农民提供了就业机会和增加收入的途径,对地方经济的发展有着积极的影响。 总之,云南茶山凭借其独特的生态环境和理想的气候条件,生产出了许多优质的茶叶品种。这些茶叶不仅具有浓郁的香气和独特的口感,还具有丰富的营养成分。云南茶山的茶叶产业在国内外市场上受到了广泛的认可和青睐。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值