基础小白,第一次开始准备记录。之所以叫磨题,是因为我做题的速度不能用刷来形容。。。但我愿意死磕,就像昨晚我梦见我自己变成骑兵连的一员,其实在梦里我真的害怕了,可以逃跑也可以投降,但我选择跟敌人死磕!
通常我是记在笔记上的,但有点慢,而且考虑重新敲一遍代码更有好处,That's all
2023.3.10
此前已经做过力扣上剑指offer的一些题,磕磕绊绊大概也就20几道。感觉不系统,昨天在知识星球上购买了代码随想录的会员,今天决定按照上面的刷题指南走一波,然后再做剑指offer和热题100,如果能做完,再之后就再制定其他计划。毕竟计划总是需要调整,现在我只想扎扎实实投入进去。
至于计算机基础,打算依照上面的经验之谈,进行快速学习,然后针对问题展开复习。
项目的话,正在着手实现一个高并发HTTP服务器,因为没有基础,只能从零开始,先从编写请求响应成功开始。
会在这里写一些自己遇到的问题,还好没人看,幼稚愚蠢也是自己的。相信自己总有拜托它的一天。
##### 磨题日记——数组
(一) 二分查找https://leetcode.cn/problems/binary-search/——力扣704,简单
错误原因:else针对的是它上面的if,而不包括第一个if的判断情况。所以它不执行第二次循环,代码一看,“哦?中间值大于目标值或者小于目标值我判断完了,那我就直接返回当前的mid。做完了!很快啊!” 实际上中间值等不等于压根没判断。
低级错误不要再犯
//错误示例
class Solution {
public:
int search(vector<int>& nums, int target)
{
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int mid=left+(right-left)/2;
if(nums[mid]>target) right=mid-1;
if(nums[mid]<target) left=mid+1;
else return mid; //错误地点
}
return -1;
}
};
// 正确代码
class Solution {
public:
int search(vector<int>& nums, int target)
{
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int mid=left+(right-left)/2;
if(nums[mid]>target) right=mid-1;
if(nums[mid]<target) left=mid+1; //或者写成if elseif else的形式
if(nums[mid]==target) return mid;
}
return -1;
}
};
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
问题释疑:问什么不是 int mid = (left + right) / 2?
答:这么写可能会发生溢出,left + right很有可能会超出int的范围 。int取值范围:int占的是4个字节,一个字节8位,也就是32位,取值范围是-2^31 ---- 2^31-1。
布置相关作业复习:
C++基本类型,溢出问题
力扣35 搜索插入位置 简单 https://leetcode.cn/problems/search-insert-position/
力扣34 在排序数组中查找元素的第一个和最后一个位置 中等 (之前做过)https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
(二) 移除元素27. 移除元素 - 力扣(LeetCode)
//正确代码一
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
for(auto it=nums.begin();it!=nums.end();it++)
{
if(val==*it)
{
nums.erase(it);
it--;
}
}
return nums.size();
}
};
//正确代码二
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int left = 0;
for (int right = 0; right < n; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
};
暴力循环肯定排除。第一种办法是我自己写的,用迭代器操作,速度击败100%,内存击败95%。
但第二种是需要仔细琢磨的一种办法——双指针。这是常用算法,需要去理解。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
复习内容:
迭代器内部实现原理和时空复杂度。
图内容源于代码随想录