977.有序数组的平方
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> r(nums.size(),0);
int k=nums.size()-1;
for(int i=0,j=nums.size()-1;i<=j;)
{
if(nums[i]*nums[i]<nums[j]*nums[j])
{
r[k--]=nums[j]*nums[j];
j--;
}
else
{
r[k--]=nums[i]*nums[i];
i++;
}
}
return r;
}
};
其实这道题目主要想的还是双指针,为么能从i=0和j=nums.size()-1开始比较,主要还是因为数组本身的排序就是从小到大的(出现了负数),所以我们比较只需要比较头和尾就行了,因为平方之后中间是最小的,因为要求是从小到大,所以我们就要比较哪个大 哪个大我们就放进nums[k--],注意这时候是k--
209.长度最小的子数组
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili
class Solution {
public:
int minSubArrayLen(int target, 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>=target)
{
subLength=j-i+1;
if(subLength<result)
result=subLength;
sum-=nums[i++];
}
}
if(result ==INT32_MAX)
{
return 0;
}
else
{
return result;
}
}
};
其实这道题的话难度主要是理解滑动窗口,这个题目要求的子数组就是要求连续的,这个时候我们可以定义两个指针,一个是窗口的头一个是窗口的尾巴,这个时候头往前动一次就将nums[j]加入sum里面,直到sum>target的时候,计算窗口的大小如果小于原先的值那么替代,然后将sum减去窗尾的值 注意这个时候不能是if因为是if的话那么就只执行一次减去窗尾的值,因为减去窗尾之后sum不一定就小于target了,所以需要while循环判断
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> jz(n, vector<int>(n, 0));
int startx=0;
int starty=0;
int loop=n/2;
int cor=1;
int mid =n/2;
int i,j;
int offset=1;
while(loop--)
{
i = startx;
j = starty;
for (j; j < n - offset; j++) {
jz[i][j] = cor++;
}
for (i; i < n - offset; i++) {
jz[i][j] = cor++;
}
for (; j > starty; j--) {
jz[i][j] = cor++;
}
for (; i > startx; i--) {
jz[i][j] = cor++;
}
startx++;
starty++;
offset += 1;
}
if (n % 2) {
jz[mid][mid] = cor;
}
return jz;
}
};
其实这个题目还是很细的,因为要考虑到圈数以及最中间的值还有转第下圈时,赋值的边界也要改动,以及初始的赋值位置,其实还是一样需要拿纸和笔模拟一下二维数组的变化过程会好懂很多。