个人主页:CSDN_小八哥向前冲~

                                 所属专栏:算法基础入门


目录

长度最小的子数组

无重复字符的最长子串

最大连续1的个数

将x减到0的最小操作数

水果成篮

找到字符串中所有字母异位词

最小覆盖字串


长度最小的子数组

题目:【LeetCode】长度最小的子数组

思路:

解法一:暴力枚举,注意,一般不推荐,因为有些题目因为时间效率问题,过不了  oj   !!!

代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n=nums.size(),len=INT_MAX;
        for(int i=0;i<n;i++)
        {
            int sum=0;
            for(int j=i;j<n;j++)
            {
                sum+=nums[j];
                if(sum>=target) len=min(len,j-i+1);
            }
        }
        return len==INT_MAX?0:len;
    }
};

解法二:双指针(滑动窗口)

代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
         int sum=0,n=nums.size(),len=INT_MAX;
         for(int left=0,right=0;right<n;right++)
         {
            //进窗口
            sum+=nums[right];
            while(sum>=target)
            {
                len=min(len,right-left+1);
                //出窗口
                sum-=nums[left++];
            }
         }
         return len==INT_MAX?0:len;
    }
};

无重复字符的最长子串

题目:【LeetCode】无重复字符的最长字串

思路:

代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128]={0};
        int n=s.size(),len=0;
        for(int left=0,right=0;right<n;right++)
        {
            hash[s[right]]++;
            while(hash[s[right]]>1)
                hash[s[left++]]--;
            len=max(len,right-left+1);
        }
        return len;
    }
};

最大连续1的个数

题目:【LeetCode】最大连续1的个数

思路:

代码:

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

将x减到0的最小操作数

题目:【LeetCode】将x减到0的最小操作数

思路:

如果直接按照题目说的操作,比较难,不好写代码也不好操作,所以我们可以转化成:

在这个数组里面找最大等于某个数的字串。

代码:

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum1=0;
        for(auto& e:nums)
            sum1+=e;
        int n=nums.size(),target=sum1-x,ret=-1;
        //细节
        if(target<0)
            return -1;
        for(int left=0,right=0,sum2=0;right<n;right++)
        {
            sum2+=nums[right];//进窗口
            while(sum2>target)
                sum2-=nums[left++];//出窗口
            if(sum2==target)
            {
                ret=max(ret,right-left+1);
            }
        }
        return ret==-1?ret:n-ret;
    }
};

水果成篮

题目:【LeetCode】水果成篮

思路:

代码:

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int hash[100000]={0};
        int n=fruits.size(),ret=0;
        for(int left=0,right=0,count=0;right<n;right++)
        {
            if(hash[fruits[right]]==0) count++;//记录有效数字
            hash[fruits[right]]++;//进哈希
            while(count>2) //出窗口挪动数据
            {
                hash[fruits[left]]--;
                if(hash[fruits[left]]==0) count--;
                left++;
            }
            ret=max(ret,right-left+1);//更新数据
        }
        return ret;
    }
};

找到字符串中所有字母异位词

题目:【LeetCode】找到字符串中所有字母异位词

思路:

代码:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ret;
        int hash1[26]={0};//哈希记录p的
        for(auto& e:p)
            hash1[e-'a']++;
        int len=p.size();
        int hash2[26]={0};
        int n=s.size(),count=0;//count记录有效字母
        for(int left=0,right=0;right<n;right++)
        {
            char in=s[right];
            if(++hash2[in-'a']<=hash1[in-'a']) count++;//进窗口记录count
            if(right-left+1>len)//出窗口
            {
                char out=s[left++];
                if(hash2[out-'a']--<=hash1[out-'a']) count--;
            }
            if(count==len) ret.push_back(left);//记录下标
        }
        return ret;
    }
};

最小覆盖字串

题目:【LeetCode】最小覆盖字串

思路:

代码:

class Solution {
public:
    string minWindow(string s, string t) {
        int hash1[128]={0};
        int kinds=0;
        for(auto& e:t)
            if(hash1[e]++==0) kinds++;
        int hash2[128]={0};
        int minlen=INT_MAX,begin=-1;
        for(int left=0,right=0,count=0;right<s.size();right++)
        {
            char in=s[right];
            if(++hash2[in]==hash1[in]) count++;
            while(count==kinds)
            {
                if(right-left+1<minlen)
                {
                    minlen=right-left+1;
                    begin=left;
                }
                char out=s[left++];
                if(hash2[out]--==hash1[out]) count--;
            }
        }
       if(begin==-1) return "";
       else return s.substr(begin,minlen);
    }
};

这些题目你都会了嘛?我们下期见!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部