前言:
现在是2024.7.17大二暑假,此前正式下定不考研直接就业的决心,于是选择报名代码随想录算法训练营学习算法题,希望一年后自己能找到好的暑期实习,在毕业前进入大厂。
Leetcode 704 二分查找
题目链接:https://leetcode.cn/problems/binary-search/description/
代码随想录题解:代码随想录 (programmercarl.com)
思路:之前在学校学习过二分查找,这次刷题有了更深刻的体会。二分查找的left和right构成的区间就是我们的查找区间,而每次我们在选择查找的都是区间中间的数也就是middle=left+right/2。想明白这个概念处理边界也很简单。左闭右闭要-1或者+1正是因为闭区间可取但我们在上次查middle已经查过,而左闭右开因为是开区间不可取所以就不用。
代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size();
int middle=0;
while(left<right) //left<=right 左闭右闭
{
middle=(left+right)/2;
if(nums[middle]>target)
{
right=middle; //right=middle-1
}
else if(nums[middle]<target)
{
left=middle+1;
}
else
{
return middle;
}
}
return -1;
}
};
Leetcode 27移除元素
题目链接:https://leetcode.cn/problems/remove-element/
代码随想录题解:代码随想录 (programmercarl.com)
思路:用暴力法的思路就是内层循环实现将需要删除的val时删除,将数组元素前移,外层则是用来遍历数组中每个数并判断是否是val。需要注意的是删除val后需要将外层下标i--(因为数组元素前移了)以及size--和前移元素时用num[j-1]=num[j]能防止超出数组边界。我对快慢指针法的理解是将慢指针理解为指向一个空数组的指针,快指针遍历时不为val则存入,为val则直接跳过,只不过这个假想的空数组是在原数组中完成的。
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val)
{
int slow=0;
for(int fast=0;fast<nums.size();fast++)
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
总结:
除了学习这两道算法题,算上今天花了一周时间把C++的基本语法特性过完,只不过还没有总结,希望自己能坚持下去。