Day2 代码随想录 刷题记录

总结:

今日上午刷题两道,用时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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值