704、二分查找、
文档讲解:代码随想录(代码随想录 (programmercarl.com))
视频讲解:【手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找】 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
第一想法:第一眼看到题目的时候还是知道用二分法来降低复杂度的,再之后自己尝试着去敲了一遍,但是输出的结果明显的出错的,当时我自己也感觉不对,后面看完视频才发现是自己对于边界的概念太模糊。
看完讲解视频后,意识到了边界清晰明了的重要性,同时对于各种可能出现的情况提前没有推演好:就例如left能不能等于right这种情况,我自己敲的时候直接就忽略掉了。同时出现的还有基础的问题:return对于函数的影响:对于可能出现的的两种情况,我的想法是设置一个变量ans,return ans来返回结果,但是题解中的同时并列两个return的想法确实方便明了了许多。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;//忘记-1了
while(left<=right)
{
int middle=left+(right-left)/2;
if(target>nums[middle])
{
left=middle+1;
}
else if(target<nums[middle])
{
right=middle-1;
}
else{
return middle;
}
}
return -1;
}
};
27、移除元素
文档讲解:代码随想录(代码随想录 (programmercarl.com))
视频讲解:
第一想法:我第一想法都没出来,之后看视频的时候才发现对于数组“不能删除、只能覆盖”的概念还是没有了解。
在看了讲解的视频之后才对于数组有了更深层次的了解:数字地址的连续性,修改数组时一般都采用覆盖方法、以及双指针的思路。对于设计双指针来实现对于数组数据的更改有了一定程度的认识。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len=nums.size();
int slowIndex=0;
for(int fastIndex=0;fastIndex<len;fastIndex++){
if(val!=nums[fastIndex]){//因为每一次没检测到慢指针都要跟着移动,所以一定要不等于
nums[slowIndex++]=nums[fastIndex];//一定要是在括号里++,不然会报错
}
}
return slowIndex;
}
};