977有序数组的平方
[题目链接](977. 有序数组的平方 - 力扣(LeetCode))
- 左右指针,左右指针,先填充大的数据,新数组从右往左填写
- 创建数组并初始化
vector<int> results(length,0);
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
// 左右指针,先填充大的数据,新数组从右往左填写
vector<int> results(nums.size(), 0);
int index = nums.size() - 1;
for(int left = 0, right = nums.size() - 1; left <= right; ){
if(nums[left] * nums[left] <= nums[right] * nums[right]){
results[index] = nums[right] * nums[right];
right = right - 1;
}
else{
results[index] = nums[left] * nums[left];
left = left + 1;
}
index = index - 1;
}
return results;
}
};
-
使用cpp中的库函数
sort(nums.begin(), nums.end())';
class Solution { public: vector<int> sortedSquares(vector<int>& nums) { for(int i = 0; i < nums.size(); i++){ nums[i] = nums[i] * nums[i]; } sort(nums.begin(), nums.end()); return nums; } };
209长度最小的子数组
[题目链接](209. 长度最小的子数组 - 力扣(LeetCode))
-
双层for循环由于耗时太长在leetcode上无法通过
-
双指针(滑动窗口):
窗口就是 满足其和 ≥ target 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
-
时间复杂度O(n),空间复杂度O(1)。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
// 左右指针
// 左指针不断减小窗口长度,右指针不断增加窗口长度
int sum = 0;
int left = 0;
int result = nums.size() + 1;
int subLength = 0;
for(int right = 0; right < nums.size(); right++){
sum += nums[right];
while(sum >= target){
subLength = right - left + 1;
result = result > subLength? subLength: result;
sum -= nums[left];
left ++;
}
}
return result == nums.size() + 1? 0 : result;
}
};
59螺旋矩阵
- 二维数组的定义
vector<vector<int>> results(n, vector<int>(n, 0));
- 右下左上依次填充数组,非常容易乱,坚持左闭右开原则
- 考虑到n奇偶性,有额外操作。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
// 四个方向循环填充数组
vector<vector<int>> results(n, vector<int>(n, 0));
int startRow = 0, startColumn = 0;
int offset = 1;
int data = 1;
int loop = n / 2;
while(data <= n * n && loop > 0){
int i = startRow, j = startColumn;
// 向右
while(j < n - offset){
results[i][j++] = data++;
}
// 向下
while(i < n - offset){
results[i++][j] = data++;
}
// 向左
while(j > startColumn){
results[i][j--] = data++;
}
// 向上
while(i > startRow){
results[i--][j] = data++;
}
offset++;
startRow++;
startColumn++;
loop--;
}
if(n%2)
results[n/2][n/2] = n*n;
return results;
}
};