977.有序数组的平方
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路:一、先把数组元素平方,然后再排序。排序的方法有冒泡法、调用sort()函数
二、双指针法。由于最大的数可能出现在数组的首和尾两个地方,所以可以用双指针法,慢指针指向最后的元素,快指针指向起始的位置,向中间靠拢。
知识点:在VS中,使用sort,
#include <algorithm>
sort(nums, nums+len); // 快速排序,升序,nums为数组,len为数组的长度
用到vector时,
#include <algorithm>//使用sort
#include <vector>//使用vector容器
vector<int>nums = { -4,-1,0,3,10 };
sort(nums.begin(), nums.end());//升序排序
209.长度最小的子数组
思路:采用滑动窗口的方法。什么是滑动窗口?其实就是双指针的方法。所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
关键的点在于如何缩小区间。首先判断前i个元素之和是否大于target,如果满足条件,那么记录下此时窗口的大小len,然后缩小窗口的大小,也就是让和减一个元素,看看还满不满足前i-1个元素之和是否大于target
判决条件使用while(sum>target),因为while可以一直迭代下去,直到不满足条件
59.螺旋矩阵II
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路:1、要转多少圈?n个元素,假设n是偶数,n/2圈,假设n是奇数,n/2圈,还剩下一个n*n放数组最中间。
2、四条边怎么填?必须自己统一规定元素的选取边界,比如左闭右开。每一圈都按照下面的方法填充:
填充上行从左到右(左闭右开)
填充右列从上到下(左闭右开)
填充下行从右到左(左闭右开)
填充左列从下到上(左闭右开)
注意内圈,比如第2圈的时候,一行的元素是比第一圈要少的,所以要注意这个变量。
下面给一段vs的代码:
int main()
{
int n = 4;
cin >> n;
vector<vector<int>>arr(n, vector<int>(n, 0));//创建一个二维数组
/*for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << arr[i][j]<<" ";
}
cout << endl;
}
*/
int start = 0;
int end = 0;
int loop = n / 2;//圈数
int mid = n / 2;//如果n是奇数,最后一个元素就是放最中间的位置
int cout = 1;//用来计数,给矩阵赋值
int offset = 1;//控制每一条边遍历的长度,每次循环右边界收缩一位
int i, j;
while (loop--)
{
i = start;
j = end;
for (; j< n-offset; j++)//模拟填充上行从左到右(左闭右开)
{
arr[i][j] = cout;
cout++;
}
for (; i < n-offset; i++)//模拟填充右列从上到下(左闭右开)
{
arr[i][j] = cout;
cout++;
}
for (; j > end; j--)//模拟填充下行从右到左(左闭右开)
{
arr[i][j] = cout;
cout++;
}
for (; i > start; i--)//模拟填充左列从下到上(左闭右开)
{
arr[i][j] = cout;
cout++;
}
start++;
end++;
offset++;
}
if (n % 2)
{
arr[mid][mid] = cout;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
std::cout << arr[i][j]<<" ";
}
std::cout << endl;
}
system("pause");
}