目录
区间类问题
Leetcode区间类问题:https://blog.csdn.net/qq_41605114/article/details/106718697
分割数组/字符串
5458. 字符串的好分割数目 https://leetcode-cn.com/problems/number-of-good-ways-to-split-a-string/
class Solution {
public:
int numSplits(string s) {
//两个Hash表 巧妙的是一个Hash先将全部内容遍历一遍,将内容压入,然后从头开始遍历,
unordered_map<char,int>M1,M2;
for(auto item:s) M2[item]++;//完全不分割
int res = 0;
for(int len = 0;len<s.size();++len){
M1[s[len]]++;//不断扩张
M2[s[len]]--;//不断收缩
int size1 = 0,size2 = 0;
//判断元素的个数 最多循环26次
for(auto item:M1) if(item.second>0) size1++;
for(auto item:M2) if(item.second>0) size2++;
if(size1 == size2) res++;
}
return res;
}
};
原地旋转矩阵
48. 旋转图像
https://leetcode-cn.com/problems/rotate-image/
本题还是需要观察一下,才能入手的
不能整行的换,下面是本题代码思路的示意图:
两个两个换,才能整个完成选择
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
if(matrix.empty()) return;
int row = matrix.size(),col = matrix[0].size();
//从外到内进行替换
int BeginR = 0,EndR = row-1;
int BeginC = 0,EndC = col-1;
while(BeginR<EndR)
{
//换四个角
//顶行和左列
for(int i = EndR,j = BeginC;i>BeginR,j<EndC;--i,++j)
{
swap(matrix[BeginR][j],matrix[i][BeginC]);//第一行和第一列交换
}
//左列和底行
for(int i = EndR,j = EndC;i>BeginR,j>BeginC;--i,--j)
{
swap(matrix[i][BeginC],matrix[EndR][j]);//第一行和第一列交换
}
//左列和底行
for(int i = EndR-1,j = BeginC+1;i>=BeginR,j<=EndC;--i,++j)
{
swap(matrix[EndR][j],matrix[i][EndC]);//第一行和第一列交换
}
//收缩
BeginR++;EndR--;BeginC++;EndC--;
cout<<BeginR<<""<<endl;
}
}
};
54. 螺旋矩阵
https://leetcode-cn.com/problems/spiral-matrix/
面试题29. 顺时针打印矩阵 https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/
本题没有任何花里胡哨的技巧等,就是单纯的模拟整个过程,思路要清晰
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.empty()) return{};
int m = matrix.size(),n = matrix[0].size();
int Rbegin = 0,Rend = m-1;
int Cbegin = 0,Cend = n-1;
vector<int> Res;
while(Rbegin!=Rend||Cbegin!=Cend)
{
//第一行
for(int i = Cbegin;i <= Cend;++i)
if( (i>=0&&i<n&&Rbegin<m)&&matrix[Rbegin][i] != INT_MIN)//固定行
{Res.push_back(matrix[Rbegin][i]);matrix[Rbegin][i] = INT_MIN;}
//右侧
for(int i = Rbegin;i<= Rend;++i)
if((i>=0&&i<m&&Cend>=0)&&matrix[i][Cend] != INT_MIN)//固定列
{Res.push_back(matrix[i][Cend]);matrix[i][Cend] = INT_MIN;}
if(Cbegin!=Cend) Cend--;
if(Rbegin!=Rend) Rbegin++;
//下侧
for(int i = Cend;i>=Cbegin;--i)
if((i>=0&&i<n&&Rend>=0)&&matrix[Rend][i] != INT_MIN)//固定行
{Res.push_back(matrix[Rend][i]);matrix[Rend][i] = INT_MIN;}
if(Rbegin!=Rend) Rend--;
//左侧
for(int i = Rend;i>=Rbegin;--i)
if((i>=0&&i<m&&Cbegin<m)&&matrix[i][Cbegin] != INT_MIN)//固定列
{Res.push_back(matrix[i][Cbegin]);matrix[i][Cbegin] = INT_MIN;}
if(Cbegin!=Cend) Cbegin++;
}
// cout<<"Rbegin"<<Rbegin<<endl;
// cout<<"Rend"<<Rend<<endl;
// cout<<"Cbegin"<<Cbegin<<endl;
// cout<<"Cend"<<Cend<<endl;
if(matrix[Rbegin][Cbegin] != INT_MIN)
Res.push_back(matrix[Rbegin][Cbegin]);
return Res;
}
};
724. 寻找数组的中心索引 https://leetcode-cn.com/problems/find-pivot-index/
class Solution {
public:
int pivotIndex(vector<int>& nums) {
if(nums.empty()) return -1;
int Right = 0,Left = 0;
for(auto item:nums) Right += item;
for(int i = 0;i<nums.size();++i){
Right -= nums[i];
// cout<<Left<<" "<<Right<<endl;
if(Left == Right) return i;
Left += nums[i];
}
return -1;
}
};