[剑指Offer笔记]3_数组
数组,字符串:连续空间
链表,树:大量指针操作
栈:与递归相关
队列:广度优先算法相关
数组
-
O(1)时间读写元素;
-
可以用数组实现
哈希表
;有了哈希表可以实现O(1)查找!
-
固定大小的数组,效率不高.
STL
中的vector
先开辟一个小的空间,当空间不够时再分配更大的空间.每次为之前的2倍.
使用动态数组要尽量计算减少改变容量大小的次数
-
注意:
数组与指针的关系
面试题:
- 在一个二维数组中,每一行都按照从左往右递归的顺序排序,每一列都按照从上到下递增的书序排序.完成一个函数,输入一个这样的二维数组和一个数,判断该数是否在数组中.
分析:
- 取数组的右上角
arr[i][j]
,判断它和目标数字target
的关系 - 若相等,则找到,若 arr < target,则target不在这一行,若arr>target,则target不在这一列
- 注意边界的判断,防止越界.
代码实现:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rows = array.size();
int cols = array[0].size();
bool FOUND = false;
int i = 0, j = cols - 1; // 左上角(i,j),i行j列
while (1) {
// 没有越界
if (i >= 0 && i < rows &&j >= 0 && j < cols) {
if (array[i][j] == target) {
FOUND = true;
break;
}
else if (array[i][j] < target) {
i++;
}
else { // array[i][j] > target
j--;
}
}
else {
break;
}
}
return FOUND;
}
};