依图凉凉经(送两道算法题)
第一道题目是二维有序矩阵查找特定target是否存在。二维有序矩阵是指每一行和每一列分别是递增的。
此题目的较优解法是每次比较剩余矩阵的右上角的元素key和target的关系,初始值row=0,col=nums[0].size()-1,target小于key时,key所在的列及右边列都比target打,故把col变量减一,target大于key时,key所在的行都比target小,故把row变量加一。直到row和col越界。返回false。(参考下图)
https://img-blog.csdn.net/20160324195705030
#include <bits/stdc++.h>
using namespace std;
bool isExists(vector<vector<int>> &nums, const int target) {
int row = 0, col = nums[0].size()-1;
while(row < nums.size() && col >= 0) {
if(target == nums[row][col]) {
return true;
}else if(target < nums[row][col]) {
col--;
} else {
row++;
}
}
return false;
}
int main(){
vector<vector<int>> v = {{1,2,3,4}, {2,3,4,5}, {3,4,5,6}, {4,5,6,7}};
cout << to_string(isExists(v, 10)) << endl;
cout << to_string(isExists(v, 7)) << endl;
return 0;
}第二题,求字符串中"YTTYYTYTYTYTT"Y和T的数量相等的最长字串,这道题目可以类比为经典题目:最长01字串的问题。不多废话了,直接上代码
#include <bits/stdc++.h>
using namespace std;
bool isExists(vector<vector<int>> &nums, const int target) {
int row = 0, col = nums[0].size()-1;
while(row < nums.size() && col >= 0) {
if(target == nums[row][col]) {
return true;
}else if(target < nums[row][col]) {
col--;
} else {
row++;
}
}
return false;
}
int longest0_1(const vector<int> &nums){
vector<int> part_sum;
int sum = 0;
for(int i = 0; i < nums.size(); i++) {
sum += nums[i];
part_sum.push_back(sum);
}
int ans = 0;
map<int,int> mp;
for(int i = 0; i < part_sum.size(); i++) {
if(mp.count(part_sum[i]) == 0) {
mp[part_sum[i]] = i;
} else {
ans = max(ans, i-mp[part_sum[i]]);
}
}
return ans;
}
int main(){
vector<int> v = {-1,-1,1,-1,1};
cout << longest0_1(v) << endl;
return 0;
}PS:前两天感冒发烧状态太差,面试时这两道题都凉了。回来之后思考了一下题目,来回馈牛友。
#笔试题目##依图科技#
查看1道真题和解析
