数组
- 内存模型
- 常见的动态扩容策略
- stl常见的接口
预备知识
coding
day1
- leetcode 704 二分查找
- 开、闭区间是针对查找范围来说的,例如[0, size - 1] 左右两侧都可以遍历到,为闭区间
- 需要清楚while的条件,结合区间,可以举单个元素的例子帮助理解
- 需要清楚right left重新赋值具体含义,结合区间进行判断,该位置有可能是目标值就不能-1、+1
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty()) return -1;
int left = 0, right = nums.size() -1;
while(left <= right){
int mid = (right - left) / 2 + left;
if(nums[mid] == target) return mid;
if(nums[mid] > target){
right = mid - 1;
}else {
left = mid + 1;
}
}
return -1;
}
};
这题可以变形为,将指定元素放到原数组最右侧。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int cnt = 0;
for(size_t index = 0; index < nums.size(); ++index){
if(val != nums[index]){
nums[cnt++] = nums[index];
}
}
return cnt;
}
};
day2
- 977 有序数组的平方
经典
vector<int> sortedSquares(vector<int>& nums) {
// 排序后的数组,最大元素在最右侧; 原数组中最小的值在中间
int left = 0, right = nums.size() - 1;
std::vector<int> ret = nums;
int pos = right;
while(left <= right){
size_t left_val = nums[left]*nums[left];
size_t right_val = nums[right]*nums[right];
if(right_val < left_val){
ret[pos] = left_val;
++left;
}else{
ret[pos] = right_val;
--right;
}
--pos;
}
return ret;
}
- 209. 长度最小的子数组
注意ret在循环内取值的时候是min 而不是 --ret
int minSubArrayLen(int target, vector<int>& nums) {
int slow = 0, fast = 0, sum = 0;
int ret = INT_MAX;
while(fast < nums.size()){
// 可以持续向右移动
sum += nums[fast];
//std::cout << "sum=" << sum << ",slow=" << slow << ",fast=" << fast << std::endl;
if( sum >= target){
ret = std::min(ret, fast - slow + 1);
// slow 向右移动
sum -= nums[slow++];
while(sum >= target){
ret = std::min(ret, fast - slow + 1);
sum -= nums[slow++];
}
}
++fast;
}
return ret == INT_MAX ? 0 : ret;
}
- 59. 螺旋矩阵 II
模拟,需要注意中心元素或n=1的情况会不会漏
vector<vector<int>> generateMatrix(int n) {
int left = 0, right = n-1, up = 0, down = n - 1;
int num = 1;
std::vector<std::vector<int>> ret(n, std::vector<int>(n));
while(left <= right && up <= down){
// 列从左到右
int val = left;
while(val <= right){
ret[left][val++] = num++;
}
val = up+1;
while(val < down){
ret[val++][right] = num++;
}
val = right;
while(val > left){
ret[down][val--] = num++;
}
val = down;
while(val > up){
ret[val--][left] = num++;
}
left++;
up++;
right--;
down--;
}
return ret;
}