- 概念
数组是存放在连续内存空间上的相同类型数据的集合
连续:增删需移动后续元素,删除的本质是覆盖
类型:相同用数组,不同用结构
数组下标从0开始
C++中二维数组连续分布
vector的底层实现是array,严格来讲vector是容器,不是数组
vector<int> vi;
array<int, 10> arr;
- 力扣704.二分查找
题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
左闭右闭:
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
if (n == 0) return -1;
if (n == 1 && nums[0] != target) return -1;
if (n == 1 && nums[0] == target) return 0;
if (target < nums[0] || target > nums[n - 1]) return -1;
int l = 0;
int r = n - 1;
int mid = l + (r - l) / 2;
while (r != l) {
if (target == nums[l]) return l;
else if (target == nums[r]) return r;
else if (target == nums[mid]) return mid;
else if (target > nums[mid]) {
l = mid + 1;
mid = l + (r - l) / 2;
}
else if (target < nums[mid]) {
r = mid - 1;
mid = l + (r - l) / 2;
}
}
return -1;
}
};
左闭右开:
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
if (n == 0) return -1;
if (n == 1 && nums[0] != target) return -1;
if (n == 1 && nums[0] == target) return 0;
if (target < nums[0] || target > nums[n - 1]) return -1;
int l = 0;
int r = n - 1;
int mid = l + (r - l) / 2;
do{
if (target == nums[l]) return l;
else if (target == nums[r]) return r;
else if (target == nums[mid]) return mid;
else if (target > nums[mid]) {
l = mid;
mid = l + (r - l) / 2;
}
else if (target < nums[mid]) {
r = mid;
mid = l + (r - l) / 2;
}
} while (mid != l);
return -1;
}
};
- 力扣27. 移除元素
题目描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解答:双指针
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
if (nums.size() == 0) return 0;
int s = 0;
int f = 0;
while (f < nums.size()) {
if (nums[f] != val) nums[s++] = nums[f++];
else f++;
}
return s;
}
};
4.力扣209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
解答:滑动窗口
小则右吞,大则左吐
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int re = INT32_MAX;
int l = 0, r = 0, sum = 0;
for (int r = 0; r < nums.size(); ++r) {
sum += nums[r];
while (sum >= target) {
re = re < (r - l + 1) ? re : (r - l + 1);
sum -= nums[l++];
}
}
return re == INT32_MAX ? 0 : re;
}
};
5.力扣59.螺旋矩阵II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
解答:左闭右开
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int c = 1, z = 0;
int loop = n / 2;
while (loop--) {
int i = z, j = z;
for (; j < n - 1 - z; ++j) res[z][j] = c++;
for (; i < n - 1 - z; ++i) res[i][j] = c++;
for (; j > z; --j) res[i][j] = c++;
for (; i > z; --i) res[i][j] = c++;
++z;
}
if (n % 2) res[n / 2][n / 2] = n * n;
return res;
}
};