今天刚看了一下c语言语法每次复习可以看这个
视频链接
977.有序数组的平方
题目建议: 本题关键在于理解双指针思想
没看题解第一反应暴力:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
nums[i] *= nums[i];
}
sort(nums.begin(),nums.end());
return nums;
}
};
思考双指针理不清楚思路,看题解
题目链接
文章讲解
视频讲解
双指针法
自己写了一遍
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
//双指针和一个空白数组b初始化为零及指针k指向新数组末尾
//双指针分别指向nums指针两侧,进行平方比较,将最大的值放入新数组末尾
vector<int> b(nums.size(),0);
int i = 0, j = nums.size() - 1, k = b.size()-1;
while ( i<=j ) {
if(nums[i]*nums[i] < nums[j]*nums[j]){
b[k] = nums[j] * nums[j];
j--;
k--;
}else {
b[k] = nums[i] * nums[i];
i++;
k--;
}
}
return b;
}
};
c语言版:需要注意动态分配内存
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
//此处int* returnSize存储的是结果数组的大小
* returnSize = numsSize;
int* B = (int*)malloc(numsSize * sizeof(int)) ;
int i = 0, j = numsSize - 1, k = numsSize - 1;
while (i <= j) {
if(nums[i]*nums[i] < nums[j]*nums[j]){
B[k--] = nums[j] * nums[j];
j--;
}else {
B[k--] = nums[i] * nums[i];
i++;
}
}
return B;
}
209.长度最小的子数组
题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
滑动窗口,主要确定如下三点:
窗口内是什么?
本题目中窗口内应为 起始地址范围内 加和大于等于target的元素
如何移动窗口的起始位置?
首先判断窗口内元素和 与target关系
每当窗口内和大于等于target时 加一
如何移动窗口的结束位置?
首先计算窗口内元素和 与target关系
每当窗口内和小于target时 加一
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
解题的关键在于 窗口的起始位置如何移动,如图所示:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
//滑动窗口的关键在于确定初始位置的移动,而for循环遍历的是终止位置,此时需要注意初始位置的移动是一个不断判断的过程,应该用while
int i = 0;//起始位置指针
int res = INT32_MAX; //初始化最终最小长度应为一个最大值
int sum = 0;
int subL = 0;//初始化最小长度
for(int j = 0; j < nums.size(); j++){ //终止位置指针
sum += nums[j];
while(sum >= target){
subL = j - i + 1;
res = res > subL ? subL : res;
sum -= nums[i++];//移动初始位置,减去初始指针的值
}
}
return res == INT32_MAX ? 0 : res;//要考虑没有该数组的情况
}
};
59.螺旋矩阵II
未看题解时的思考:n方各数字,n*n的正方形矩阵,如果用暴力法
题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int loop = n / 2 ,mid = n/2;
int offset = 1;//初始化对角线元素,每循环一次则+1
int x = 0,y = 0;//初始化第一个元素
int count = 1;//填值初始计数
int i,j;
while(loop--) { //循环圈数应为n/2,可以理解为每遍历一圈遍历两行两列
i=x;
j=y;
//模拟填充上行从左到右(左闭右开)
for ( j ; j < n - offset; j++){
res[i][j] = count++;
}
//模拟填充右列从上到下(上闭下开)
for ( i;i < n - offset; i++ ){
res[i][j] = count++;
}
// 模拟填充下行从右到左(左闭右开)
for (; j > y; j--) {
res[i][j] = count++;
}
// 模拟填充左列从下到上(左闭右开)
for (; i > x; i--) {
res[i][j] = count++;
}
// 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
x++;
y++;
// offset 控制每一圈里每一条边遍历的长度
offset ++;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2==1) {
res[mid][mid] = count;
}
return res;
}
};
总结
文章链接: