1.题目链接:704. 二分查找 - 力扣(LeetCode)
2.学习视频链接:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
3.看到题目的第一想法:因为之前做过这道题,所以一下子就想到使用二分法。
4.看完代码随想录的想法:
以前写没太注意区间开闭,所以在while的判断条件错过几次。现在深刻明白了区间开闭对执行内容进行的影响。
5.困难:
暂时没有遇到
6.代码实现:
1.“左必右闭”
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;//开始时左边的下标
int right=nums.size()-1;//数组最右边的下标
int mid;//用于存放中间数的下标
while(left<=right){
mid=(left+right)/2;
if(nums[mid]<target){
left=mid+1;
}
if(nums[mid]>target){
right=mid-1;
}
if(nums[mid]==target){
return mid;
}
}
return -1;
}
};
2.“左闭右开”
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;//左边界
int right=nums.size();//右边界
int mid;//用于存放中间数的下标
while(left<right){
mid=(left+right)/2;
if(nums[mid]<target){
left=mid+1;
}
if(nums[mid]>target){
right=mid;
}
if(nums[mid]==target){
return mid;
}
}
return -1;
}
};
1.双指针:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//fast是指向的新数组的值
//slow则是新数组的下标
int slow=0;
for(int fast=0;fast<=nums.size()-1;fast++){
//这里的判断语句的意思就是如果发现新数组里面的值是要删除的那就不执行下面语句,相当于只让fast++
if(nums[fast]!=val){
nums[slow++]=nums[fast];
}
}
//slow的值就是新数组的长度
return slow;
}
};
2.暴力解法:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for (int i = 0; i < size; i++) {
if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
for (int j = i + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--; // 此时数组的大小-1
}
}
return size;
}
};
视频链链接:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili
-
自己看到题目的第一想法:我自己进行分析之后,马上就想到的是暴力解法。虽然之前有做过这题知道双指针法,但是并没有很深刻的了解双指针法。
-
看完代码随想录之后的想法:对双指针中的“fast指针”和“slow指针”有了一个全新的了解,fast指针是用来指向新数组的值,而slow是代表着新数组的下标。
-
自己实现过程中遇到哪些困难:
-
我自己在实现的时候(暴力解法)在i和j的范围大小出了问题,我的i,j设置成小于数组的nums.size()了,群友给我解释之后我知道了,数组的长度是一直在变化的,应该循环的最终值是变量size的大小;
-
今日收获:1.明白了左右边界是否取值对代码的影响2.重新理解了双指针法当中fast指针和slow指针分别的含义。
-
学习时长:大概两小时左右。晚上继续肝拓展题,先肝一会儿这周学校的实验报告。学习一会STL。