代码随想录第二天|Leetcode977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II
Leetcode977 有序数组的平方
基本信息
题目链接:有序数组的平方
文章链接:代码随想录-有序数组的平方
完成情况:AC通过
代码:
vector<int> sortedSquares(vector<int>& nums) {
int len = nums.size();
vector<int> ans(len,0);
int l = 0;
int r = len-1;
int k = len - 1;
while(l <= r)
{
if(nums[l] * nums[l] <= nums[r] * nums[r])
{
ans[k--] = nums[r] * nums[r];
r--;
}
else
{
ans[k--] = nums[l] * nums[l];
l++;
}
}
return ans;
}
思路介绍
数组题目首先观察数组的特点,其中偏序大小事最为重要的性质,本题中已给出非递减顺序,则要利用该性质。
若都为正数,则平方后顺序不变;
有负数情况下,则观察到两侧的数值的平方回避内侧的平方值大,如此则利用分治的思想来逐一比较两端的平方,并逐渐内移动。
Leetcode209 长度最小的数组
基本信息
题目链接:长度最小的数组
文章链接:代码随想录-长度最小的数组
完成状态:用时20min,AC通过
代码:
int minSubArrayLen(int target, vector<int>& nums) {
int l = 0, sum = 0, sublength = 0;
int result = INT32_MAX;
int len = nums.size();
for(int j = 0; j < len;j++)
{
sum+=nums[j];
while(sum >= target)
{
sublength = j - l + 1;
result = (result < sublength)?result:sublength;
sum -= nums[l++];
}
}
return result == INT32_MAX?0:result;
}
思路分析
本题主要思想为滑动窗口!!
滑动窗口则是又动态规划的影子,是利用已有的局部信息,利用O(1)的花费去更新下一状态,如此节省不必要的循环花费。
具体细节:维护一个窗口,两侧可以滑动,右端移动后,左端跟上更新,充分利用已获得的信息。
Leetcode59 螺旋矩阵||
基本信息
题目链接:螺旋矩阵||
文章链接:代码随想录-螺旋矩阵||
完成情况: AC通过,花费15min
代码:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int startx = 0;
int starty = 0;
int loop = n / 2;
int mid = n / 2;
int offset = n;
int val = 1;
while(loop--)
{
int i = startx;
int j = starty;//x and y are the positionof val;
for(i = startx; i< offset - 1; i++)
res[starty][i] = val++;
for(j = starty; j < offset - 1; j++)
res[j][i] = val++;
for(;i>startx;i--)
res[j][i] = val++;
for(;j > starty; j--)
res[j][i] = val++;
//更新下一轮的赋值
startx++;
starty++;
offset--;
}
if(n % 2 == 1)
res[mid][mid] = val;
return res;
}
思路分析
本题没有过多地算法技巧,更注重编程习惯和意识。
在编程时要谨记不变量,全局遵守统一的规则与调度,如本题中,横向循环中是**[初始点,终止点)**,则后面每次循环都应该如此,减少混乱,而且特殊情况单独处理,n是奇数时,最中间的一个点后面单独处理,如此就方便许多。
此外,要加一些额外的状态变量来记录遍历情况。
数组总结
通过两天的习题可以发现:
数组本身是简单的数据结构,其重要考察为二分法、双指针、滑动窗口、模拟行为。
重点在于思路清晰、编程进行状态清晰,掌握二分、双指针、滑动窗口三种方法。