个人主页: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);
}
};
这些题目你都会了嘛?我们下期见!