代码随想录打卡第一天|| leetcode704二分查找,27移除元素
二分查找.704
视频链接:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
一开始看到这道题目时是没有想法的,所以就用了暴力解法硬做。 执行时间26ms。
class Solution { public: int search(vector<int>& nums, int target) { for (int i = 0; i < nums.size(); i++) { if (nums[i] == target) { return i; } } return -1; } };
代码随想录解法思路
从左闭右闭或者左闭右开的思路处理二分法,推出循环的条件更简洁,通过left<=right or left < right即可。也不需要对result进行多重判断,直接返回middle即可。具体思路就是直接用left和right去定义搜索空间,然后进入while循环找中值判断,基于左闭右闭或者左闭右开的原则进行left或者right的重新赋值。主要注意的有两点,一个是在while循环的时候要根据[]或者[)的原则判断left<=right或者left<right是否是合法区间。第二个点在与比完大小后,赋值给left或者right的时候是否包含middle,如果是[ ]就不需要包含,因为middle已经比较过了。如果是[ )就需要包含。
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1;
while (l<=r) {
int mid = (l + r + 1) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
r = mid-1;
} else {
l = mid+1;
}
}
return -1;
}
};
用二分查找写完后感觉还是有些似懂非懂,没有完全理解透,写代码过程也不顺畅,容易卡住,代码水平也还有所欠缺。
移除元素.27
代码随想录解法思路
快慢双指针,两个指针从同一位置出发(数组头部)。检查快指针的值是否是需要删除的数值,如果不是:快指针指向的值赋值给慢指针,快指针++,慢指针++。如果是:快指针++。直到快指针到数组结尾。此时返回慢指针的值就是删除操作后的数组长度
定义一个快指针和慢指针,在if语句判断目标值是否等于数组中的某个元素,如果等于就把这个元素赋值给慢指针组成一个新数组,最后返回新数组的下标。执行时间3ms.
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;
}
};
移除元素这部分感觉就是较好理解,思路理清之后很快就做完。
今天应该是学了有个两三小时,因为之前没写过博客,也在现学现做。还有就是语法也不够好,所以让我觉得日后还是该多学学,现在就先当个卑微的小渣渣啦。