碎碎念:决心要在Gap 这一年提高自己的代码能力,就从刷算法题开始吧,有上过acwing不太能持续跟上,于是决定跟着代码随想录的专题学习了,从零开始,希望能坚持每日更新
ps:在记录的时候希望可以同时锻炼自己的表达,之前存在记录的思路和方法再看一遍看不懂也不能回想起来的情况,这次尽量避免啦
数组专题
10.20 数组——查找类型
1. LCR 121. 寻找目标值 - 二维数组 - 力扣(LeetCode)
问题描述:
- 对于二维数组,每行数字递增,每列数字递增,在该数组中寻找target
思路:
- 分析数组特征,不难发现,若将该数组逆时针旋转45°,则可变成二叉搜素树;
- 对于根节点,若其值 x > target , 则向左寻找,即j--;反之 i++;
代码:
class Solution{
public:
bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {
int i = 0;
if (plants.size() == 0)
return false;
int j = plants[0].size() - 1 ;
while(i < plants.size()&&j >= 0){
if(plants[i][j] > target)
j--;
else if(plants[i][j] < target)
i++;
else
return true;
}
return false;
}
};
分析:
- 注意事项:注意j的取值;注意while循环的条件
- 时间复杂度:
2.704. 二分查找 - 力扣(LeetCode)
问题描述:
- 给定n个元素的有序数组nums,寻找目标值target,若存在返回下标,不存在返回下标
思路:
- 这是一道传统的二分查找题目,数组有序且无重复数字
代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left <= right){
int mid = (right-left) / 2 + left;
if(nums[mid] > target)
right = mid -1;
else if (nums[mid] < target)
left = mid+1;
else
return mid;
}
return -1;
}
};
分析:
- 遇到的问题:①while循环中的条件没搞清楚;② 在right,left重新赋值时犯了重新加了int,相当于重新定义局部变量的错误,导致报错超时
- 时间复杂度:logn
反思与疑问:
- 提升代码能力之路遇到的问题
- 不能坚持:一直都有刷题的意识,但总是断断续续不系统,同时易忘,所以在保研过程中机试依然是自己的弱项,甚至是致命项
- 不知道要如何系统学习,让知识过脑子:尝试过acm模式和leetcode模式,学习过acwing有做笔记,又有看到代码随想录的方法,但始终没有找到最适合自己的方法,做笔记也是有尝试在各个平台记录,最开始想用onenote一直以来的记笔记软件,但不方便手写和写代码,又尝试了平板,但感觉其实记录下来思路过程对自己的记忆好像没有加深,我最喜欢的方式应该是纸记,但是随手就会丢弃,最终选择了飞书,但依然存在记忆不深的问题,我觉得是复习不勤和练习不够的问题,在同一类型题我每次只学了模板题就没有再继续下去了
- 总而言之,我十分着急,着急吞下每个类型的题目,对于广度及其的渴望,而对于具体每个模块算法的深度不愿深耕,这应该是我自学路上一直遇到的问题,因为没有合理的适合自己的计划,所以一遇到困难就会放弃,三天打鱼两天筛网;在算法提升这件事上,我确实只是一个还未踏进门的门外汉,虽然心向往已久,在我意识到刷题很重要这件事已有一年之余
- 刷题过程中遇到的问题
- 零散的基础知识忘记
- 有思路但写不出代码,感觉还是写的太少的缘故
唯有更加勤奋才能摆脱coding threat,所以接下来还是好好的沉下心提升吧!相信并坚持长期主义!希望通过写博客的正反馈促进我坚持下去,也欢迎大佬们给出建议呀!