题解:根据描述,我们按照描述一步一步来就行。
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
for(int i=0;i<A.size();++i){
for(int j=0;j<A[i].size();++j){
A[i][j] =(!A[i][j]);
}
reverse(A[i].begin(),A[i].end());
}
return A;
}
题解:根据描述,有如下想法,对于测试点1,只要找到首个匹配字符位置,末尾字符匹配位置,使用replace函数替换即可。在下轮替换的时候,开始找的位置应为由于插入而带来的字符串长度改变的偏置。
根据这一想法,可以通过前8个测试点。后面的替换位置并不是有序的,因此我们需要把替换位置sort一下。重写一下输入的数据结构。
struct tmp{
int index;
string source;
string target;
};
static bool cmp(struct tmp a,struct tmp b){
return a.index<b.index;
}
string findReplaceString(string &S, vector<int>& indexes, vector<string>& sources, vector<string>& targets) {
vector<struct tmp>v(indexes.size());
for(int i=0;i<indexes.size();++i){
v[i].index = indexes[i];
v[i].source = sources[i];
v[i].target = targets[i];
}
sort(v.begin(),v.end(),cmp);
int bisa=0;
for(int i=0;i<indexes.size();++i){
int k=0,j,start=0;
if(i=0)j = v[i].index;
else j = v[i].index+bisa;
start=j;
for(;j<S.length();++j){
if(S[j]!=v[i].source[k])
break;
else k++;
}
if(k==v[i].source.length()){
S.replace(S.begin()+start,S.begin()+start+v[i].source.length(),v[i].target);
//每次替换带来了偏置
bisa += v[i].target.length()-v[i].source.length();
}
}
return S;
}
题解:根据描述,数据量在0-30范围内,使用蛮力算法即可。枚举A中出现的1,对于B中出现的1,有相同偏置的位置在记录数组中加一。比如
index A | 0 | 1 | 2 | index B | 0 | 1 | 2 |
---|---|---|---|---|---|---|---|
0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
2 | 0 | 1 | 0 | 2 | 0 | 0 | 1 |
对于矩阵A(0,0)处的1,B中所有的1(分别位于[(1,1)(1,2),(2,2)]处),相对于A(0,0)处的偏置分别为[(1,1)(1,2),(2,2)] 下标相减即可
对于矩阵A(0,1)处的1,B中所有的1(分别位于[(1,1)(1,2),(2,2)]处),相对于A(0,0)处的偏置分别为[(1,0),(1,1),(2,1)]
对于矩阵A(1,1)处的1,B中所有的1(分别位于[(1,1)(1,2),(2,2)]处),相对于A(0,0)处的偏置分别为[(0,0),(0,1),(1,1)]
对于矩阵A(2,1)处的1,B中所有的1(分别位于[(1,1)(1,2),(2,2)]处),相对于A(0,0)处的偏置分别为[(-1,0),(-1,1),(0,2)]
统计偏置数组[(1,1)(1,2),(2,2)],[(1,0)(1,1),(2,1)],[(0,0),(0,1),(1,1)],[(-1,0),(-1,1),(0,2)],可发现(1,1)出现最多,是为3次。
int largestOverlap(vector<vector<int>>& A, vector<vector<int>>& B) {
int N = A.size();
int count[2*N][2*N];
memset(count,0,sizeof(count));
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
if (A[i][j] == 1)
for (int i2 = 0; i2 < N; ++i2)
for (int j2 = 0; j2 < N; ++j2)
if (B[i2][j2] == 1)
count[i-i2 +N][j-j2 +N] += 1;
int ret = 0;
for(int i=0;i<2*N;++i){
for(int j=0;j<2*N;++j){
ret = max(ret,count[i][j]);
}
}
return ret;
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有