一,题目截图
二,编程语言知识回顾–C++ vector
vector(向量): C++中的一种数据结构,确切的说是一个类。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。
用法: 1. include
2. using namespace std;
声明: 1. vector a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除。)
2. vector< vector< int>> array(3) (array可以保存三个向量,向量长度可变。)可以resize改变大小,具体用法见引用第二篇。
函数:1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据
引用自:http://blog.csdn.net/hancunai0017/article/details/7032383
http://blog.csdn.net/zsuguangh/article/details/6135529
三,解法
题中不让用的解法:
找到‘X’后,将它周围的‘X’全部变为‘.’即可。
题目要求不可改变board,额外空间为O(1):
class Solution {
public:
int countBattleships(vector<vector<char>>& board) {
int m = board.size();
if (m == 0) return 0;
int n = board[0].size();
int count = 0;
for (int i = 0; i<m; i++) {
for (int j = 0; j<n; j++) {
if (board[i][j] == '.') continue;
if (i > 0 && board[i - 1][j] == 'X') continue;
if (j > 0 && board[i][j - 1] == 'X') continue;
count++;
}
}
return count;
}
};
找到的‘X’上面以及左边都没有‘X’,即为符合条件的‘X’
如果找到X上面或者左面有X,说明这个X与上面或左面的X是同一个战舰上的一部分!!!!