代码随想录数组部分总结
1、LC704 二分查找(easy)
采用左闭右闭的方法进行二分查找;
时间复杂度:O(log n)
空间复杂度:O(1)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1; //左闭右开无需-1
while(left <= right){ //左闭右开 《
int mid = left + (right - left )/2;
if(nums[mid] > target){
right = mid - 1; //左闭右开right = mid;
} else if(nums[mid] < target){
left = mid + 1;
}else return mid;
}
return -1;
}
};
2、LC27 移除元素(easy)
采用双指针法,使用快指针向后遍历不等于目标值的元素赋值给慢指针,慢指针刷新原数组。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow= 0;
for(int fast = 0; fast < nums.size(); fast++){
if(nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
return slow;
}
};
3、LC977 有序数组的平方
数组按照递增排序,其中含有负数,采用双指针法,比较最大的平方值,倒叙插入ans数组中,注意ans数组初始化的方式:vector ans(nums.size());或vector ans(nums.size(), 0);
时间复杂度为O(n)
空间复杂度为O(n)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
vector<int> ans(nums.size());
int left = 0;
int right = nums.size() - 1;
while(left <= right){
if(nums[left] * nums[left] < nums[right] * nums[right]){
ans[k--] = nums[right] * nums[right];
right--;
}else{
ans[k--] = nums[left] * nums[left];
left++;
}
}
return ans;
}
};
4、LC209 长度最小的子数组
使用双指针来模拟动态窗口,通过动态调整慢指针的方式更新窗口长度;
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int fast = 0;
int slow = 0;
int ans = INT32_MAX;
int leng = 0;
for(int fast = 0; fast < nums.size(); fast++){
sum += nums[fast];
while(sum >= target){
leng = fast - slow + 1;
ans = ans < leng? ans : leng;
sum -= nums[slow++];
}
}
return ans == INT32_MAX? 0:ans;
}
};
5、LC59 螺旋矩阵 II
模拟法,采用左闭右开的方式,一圈一圈的循环,循环次数为loop = n/2,offset 为调整遍历的长度,也就是边界收缩,starty和starty为每一圈遍历的起点。同时注意若为奇数,则需要对终点手动赋值。
时间复杂度 O(n^2)
空间复杂度 O(1)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int count = 1;
vector<vector<int>> res(n,vector<int>(n,0));
int loop = n/2;//外循环次数
int startx = 0;
int starty = 0;
int i,j;
int offset = 1;
while(loop--){
i = startx;
j = starty;
for(j; j < n-offset; j++){
res[i][j] = count++;
}
for(i;i < n-offset; i++){
res[i][j] = count++;
}
for(;j>starty;j--){
res[i][j] = count++;
}
for(;i>startx;i--){
res[i][j] = count++;
}
offset++;
startx++;
starty++;
}
int mid = n/2;
if(n%2)res[mid][mid] = count;
return res;
}
};