总结:
今日上午刷题两道,用时2h10mins。
状态不错。
值得反思的是很多基础语法与输入的问题。还有对于边界的把握度不够,基础完成了思路后一定要完成边界的处理,这个点考虑得还不够到位。
59.螺旋矩阵II
自己的想法:
找不同矩阵之间的行列下标的规律———一直都是右下左上,直到找到中间元素。/直接用数学方法找出行列对应元素的规律。(没找到)
“右下左上”(螺旋变化)分别对应行/列的增减。
注意:
1.二维数组的vector表现形式vector<vector<int>>,初始化的格式表达为:
int n = 5; // 假设 n 是已知的
vector<vector<int>> nums(n, vector<int>(n, 0));
外层的n表示每一行的n的行数,内层的n表示行里是vector<int>类型的大小为n的初始值为0的值。
2.
for(;j < n;j ++){
if(k <= n * n) nums[i][j] = k++;
}
for(;i < n;i ++){
if(k <= n * n) nums[i][j] = k++;
}
第一个循环结束后j = n,边界条件被破坏了。而且因为原有条件限制的i < n/j < n,所以在这里只能够填补最外层的元素。
关键点在于,要确认右下左上的循环次数。
正确解法:
注意:自己的整体思路(右下左上)是正确的,但是在边界/循环条件条件上可能还存在一定的判断漏洞。
考虑轮次循环的次数,考虑每循环一个圈的起始的位置x, y 的值,考虑边界缩减的大小offset。同时x, y与offset要根据轮次的变化来改变。
考虑到层数,所以最后赋值的值要单独拿出来。
多考虑循环中的边界条件以及会随时变化的值。以及牢记,for循环中很容易产生边界溢出。
58. 区间和
(代码随想录后续扩充的题目)
回归到熟悉的编译器模式,记得带上
#include<iostream>
#include<vector>
using namespace std;
自己的想法:
直接写,简单无脑。但是还是答案出错。
要注意的点:
1.多次输入要带入while(cin >> a >> b),这样的模式来获得循环的输入。
2.同时因为每次都要输出不一样的答案,所以sum的值也应该放到里面来计算。
3.确保样例中的输入在代码中都有对应的cin>>。
正确的做法:前缀和
如果数据本身卡一个n次多查询的话,上述的方法可能就要超时。
注意的地方:
1.自己在根据前缀和写的时候前缀和的计算方式有误,又写了两个循环。
方便的方法应该是直接在输入的时候就顺带计算完。
for(int i = 0;i < count;i ++)//完成nums的数组的输入
{
cin >> nums[i];
sum += nums[i];
p[i] = sum;//每次都在基础上叠加,不要再重复计算。
}
sum的性质理解与运用。
2.考虑到边界值的问题。如果可以直接计算出来的话,p[b] - p[a - 1]的未计算出来的情况也要考虑到。(a可能直接变成负值了)
3.输入count后再进行赋值。
cin >> count;
vector<int> nums(count, 0);//对nums数组进行赋值
vector<int> p(count, 0);//前缀和数组
先后顺序不要搞反。
4.循环输出的结果考虑写好换行符。(endl)