56. 合并区间
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
sort(intervals.begin(), intervals.end());
int n=intervals.size();
for(int i=0;i<n;)
{
int j=i+1;
int pi1=intervals[i][1];
while(j<n&&pi1>=intervals[j][0])
{
pi1=max(pi1,intervals[j][1]);
j++;
}
ans.push_back({intervals[i][0],pi1});
i=j;
}
return ans;
}
};
point:
1.并没有说是顺序数组,所以先用sort排序
2.双指针的运用
3.ans.push_back({intervals[i][0],pi1})用{}
面试题 01.07. 旋转矩阵
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
// auto ans=matrix;
int n=matrix.size();
vector<vector<int>> ans(n, vector<int>(n));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
ans[i][j]=matrix[n-1-j][i];
}
}
matrix=ans;
}
};
point:
对于初始化ans:
不可以简单地写vector<vector> ans;对vector要初始化大小。
或者直接auto ans=matrix;
498. 对角线遍历
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
int m=matrix.size();
if(m==0)return {};
int n=matrix[0].size();
vector<int> ans;
int s=0;
while(s<m+n-1)
{
int i1=s<(m-1)?s:(m-1);
int j1=s-i1;
while(i1>=0&&j1<n)
{
ans.push_back(matrix[i1][j1]);
i1--;
j1++;
}
s++;
if(s>=m+n-1)break;
int j2=s<(n-1)?s:(n-1);
int i2=s-j2;
while(j2>=0&&i2<m)
{
ans.push_back(matrix[i2][j2]);
j2--;
i2++;
}
s++;
}
return ans;
}
};
面试题 01.08. 零矩阵
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
set<int> row;
set<int> col;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(matrix[i][j]==0)
{
row.insert(i);
col.insert(j);
}
}
}
for(auto x=row.begin();x!=row.end();++x)
{
for(int j=0;j<n;j++)
{
matrix[*x][j]=0;
}
}
for(auto x=col.begin();x!=col.end();++x)
{
for(int i=0;i<m;i++)
{
matrix[i][*x]=0;
}
}
}
};
利用容器set无法插入重复数据并且自动排序的特征来进行对指定行列的记录
point:
- auto x=row.begin();x!=row.end();++x
x是指针。
14. 最长公共前缀
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int n=strs.size();
string ans="";
if(n==0)return "";
int m=strs[0].size();
for(int j=0;j<m;j++){
int count = 0;
for(int i=1;i<n;i++)
{
if(j<strs[i].size()&&strs[0][j]==strs[i][j])count++;
}
if(count==n-1)ans+=strs[0][j];
else return ans;
}
return ans;
}
};
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string ans=(strs.size()==0)?"":strs[0];
for(string s:strs){ while(s.find(ans)!=0)ans=ans.substr(0,ans.size()-1);
}
return ans;
}
};
point:
1.string可以相加,
string1=“h”;
string2=“i”;
string1+string2=“hi”;
char相加为ASCII码相加
5. 最长回文子串
class Solution {
public:
string longestPalindrome(string s) {
int n=s.length();
if(n<1)return "";
string ans="";
for(int i=0;i<n;i++)
{
int len1=lengthofstring(s,i,i+1);
int len2=lengthofstring(s,i,i);
int len=len1>len2?len1:len2;
ans=len>ans.length()?s.substr(i-(len-1)/2,(2*len+1)/2):ans;
/*(i-(len-1)/2,i+len/2)*/
}
return ans;
}
int lengthofstring(string s,int left,int right)
{
int n=s.length();
int l=left;
int r=right;
while(l>=0&&r<n&&s[l]==s[r]){
l--;
r++;
}
return r-l-1;
}
};
point:
/(i-(len-1)/2,i+len/2)/
151. 翻转字符串里的单词
class Solution {
public:
void myreverse(string &s, int left, int right)
{
int l=left,r=right;
while(l<r)
{
swap(s[l],s[r]);
l++;
r--;
}
}
string reverseWords(string s) {
reverse(s.begin(),s.end());
int l=0,r=0;
int n=s.size();
while(s[0]==' ')s.erase(s.begin());
while(r<s.length())
{
while(r<s.length()&&s[r]!=' ')r++;
myreverse(s,l,r-1);
while(r+1<s.length()&&s[r+1]==' ')
{
s.erase(r+1,1); //s.erase(s.begin()+r+1);
}
r++;
l=r;
}
while(s[s.size()-1]==' ')s.erase(s.end()-1);
return s;
}
};
12.8更新
erase一共三种用法:
1.erase(pos,n);
删除从下标pos开始的n个字符,比如erase(0,1)就是删除第一个字符
2.erase(position);
删除postion处的一个字符(position是一个string类型的迭代器)
3.erase(first,last)
删除从first到last之间的字符(first和last都是迭代器)
s.erase(r+1,1);
s.erase(s.begin()+r+1);
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(),s.end());
istringstream ss(s);
string ans,str;
while(ss>>str)
{
reverse(str.begin(),str.end());
ans+=str+' ';
}
return ans.substr(0,ans.length()-1);
}
};
28. 实现 strStr()
暴力解法O(m*n)
class Solution {
public:
int strStr(string haystack, string needle) {
int n=haystack.length();
int m=needle.length();
if(n==0&&m!=0)return -1;
if(m==0)return 0;
int i=0,j=0;
while(i<n&&j<m)
{
if(haystack[i]==needle[j]){
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j==m)return i-m;
return -1;
}
};
point:对于搜索不到时双指针的变换i=i-j+1; j=0;
库函数解法
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.empty())return 0;
int pos=haystack.find(needle);
return pos;
}
};