二刷:
看了两句书上的自己的总结,决定不能放弃,自己搞出来:
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
int rows = matrix.size();
vector<int> result;
if(rows < 1) return result;
int cols = matrix[0].size();
printCircle(matrix, result, 0, rows-1, cols-1);
return result;
}
void printCircle(vector<vector<int> > matrix, vector<int>& result,
int start, int endrow, int endcol){
if(start>endrow || start>endcol) return;
for(int i=start; i<=endcol; i++) {
result.push_back(matrix[start][i]);
}
if(endrow == start) return;
for(int i=start+1; i<=endrow; i++) {
result.push_back(matrix[i][endcol]);
}
if(endcol == start) return;
for(int i=endcol-1; i>=start; i--) {
result.push_back(matrix[endrow][i]);
}
for(int i=endrow-1; i>start; i--) {
result.push_back(matrix[i][start]);
}
printCircle(matrix, result, start+1, endrow-1, endcol-1);
}
};
感觉写得比之前简洁,嘿嘿
这次也不是特顺,一直提示段错误,于是把两个判断加上,各种自查,还是段错误;偶然发现自己没有return result;加上之后,过;这个锅要给牛客,提示错误。应该提示没有返回值。
然后想验证一下没有那两个判断行不,结果是能过但是答案不对,会重复走走过的路。
总的来说自己表现不错!
/*******************************************/
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> result;
int rows = matrix.size();
if(rows == 0) return result;
int cols = matrix[0].size();
if(cols == 0) return result;
int start = 0;
int endRow, endCol;
while(start*2 < rows && start*2 < cols) {
endRow = rows-1-start;
endCol = cols-1-start;
for(int i=start; i<=endCol; i++) {
result.push_back(matrix[start][i]);
}
if(endRow>start) {
for(int i=start+1; i<=endRow; i++) {
result.push_back(matrix[i][endCol]);
}
if(endCol>start) {
for(int i=endCol-1; i>=start; i--) {
result.push_back(matrix[endRow][i]);
}
if(endRow-start > 1) {
for(int i=endRow-1; i>start; i--) {
result.push_back(matrix[i][start]);
}
}
}
}
start++;
}
return result;
}
};
提取函数:
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> result;
int rows = matrix.size();
if(rows == 0) return result;
int cols = matrix[0].size();
if(cols == 0) return result;
int start = 0;
int endRow, endCol;
while(start*2 < rows && start*2 < cols) {
endRow = rows-1-start;
endCol = cols-1-start;
printInCircle(matrix, start, endRow, endCol, result);
start++;
}
return result;
}
void printInCircle(vector<vector<int>> matrix,
int start, int endRow, int endCol,
vector<int>& result) {
for(int i=start; i<=endCol; i++) {
result.push_back(matrix[start][i]);
}
if(endRow>start) {
for(int i=start+1; i<=endRow; i++) {
result.push_back(matrix[i][endCol]);
}
if(endCol>start) {
for(int i=endCol-1; i>=start; i--) {
result.push_back(matrix[endRow][i]);
}
if(endRow-start > 1) {
for(int i=endRow-1; i>start; i--) {
result.push_back(matrix[i][start]);
}
}
}
}
}
};
这道题写得灰常坎坷。
首先各种拼写错误,中英不分;(建议牛客网保存每次提交的同时保存每次的错误提示)
然后是溢出。我不太懂,没意识到是数组越界,以为是提取函数的vector传递出了问题(确实是有问题),传参的地址传参和值传参。于是各种试啊,不过。上网查了以后改成函数声明参数用&,感觉这里应该对了呀,可是还是提示溢出,应该不是这个问题。于是中午睡了一觉下午一步一步试。发现还是粗心if条件里row写成col了。
改正后编译成功,但是答案正确率不对。对着给出的有问题的测试用例改了两次,最后对了。
反思:
一定要自己用测试用例做一下!!各基本测试用例+特殊测试用例!!
不清楚的地方:
还是引用参数,地址传参这个知识点不太清楚。还有就是vector不够了解,不知道它和数组有什么异同。