977-有序数组的平方
题目链接:LeetCode-977
方法一:暴力排序
算法思想:次次平方出结果,最后利用快排排序
时间复杂度是:O(n + nlogn)
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
for(int i= 0; i < A.size(); i++){
A[i] *= A[i];
}
sort(A.begin(), A.end()); //快排
return A;
}
};
方法二:双指针
时间复杂度为:O(n)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1; //定义数组长度!
vector<int> result(nums.size(),0); //建立新的数组
for(int i = 0, j = nums.size() - 1; i <= j;){ //用i,j定义数组的头和尾,比较i&j
if(nums[i]*nums[i] > nums[j]*nums[j]){
result[k--] = nums[i]*nums[i]; //i^2大,直接放数组尾巴
i++;
}
else{
result[k--] = nums[j]*nums[j]; //j^2大,放数组尾巴
j--;
}
}
return result;
}
};
209-长度最小的子数组
题目链接:LeetCode-209
方法:滑动窗口
时间复杂度:O (n)
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0;
int i = 0; //滑动窗口起始位置
int subLength = 0; //滑动窗口的长度
for(int j = 0; j < nums.size(); j++){
sum += nums[j];
while(sum >= s){
subLength = j - i + 1;
result = result < subLength ? result : subLength;
sum -= nums[i++];
}
}
return result == INT32_MAX ? 0 : result;
}
};
59-螺旋矩阵||
题目链接:LeetCode-59
算法思想:(左闭右开)
offset的意义在于 结束一圈后 起始位置向后移 结束位置向前移。可以画和n=4或者n=5的矩阵,会比较好理解。offset就是由于要去更向内的一圈,内圈元素更少的地方循环,所以循环的次数变少了
- 时间复杂度 O(n^2):
- 空间复杂度 O(1)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int x = 0,y = 0; //循环一圈开始位置
int loop = n / 2;
int mid = n / 2;
int count = 1;
int offset = 1;
int i, j;
while(loop --){ //左闭右开
i = x;
j = y;
//从左到右
for(j = y; j < n - offset; j++)
res[x][j] = count++;
//从上到下
for(i = x; i < n - offset; i++)
res[i][j] = count++;
//从右到左
for(; j > y; j--)
res[i][j] = count++;
//从下到上
for(; i > x; i--)
res[i][j] = count++;
//开始第二圈
x++;
y++;
offset += 1;
}
//n为奇数单独赋值
if(n % 2)
res[mid][mid] = count;
return res;
}
};