704. 二分查找
第一想法:要么左闭右闭,要么左闭右开,以左闭右开为例;左闭右闭的话,就是while条件变left <= right,right = middle+1;
查看代码随想录后的想法:与题目相符
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while (left < right ){
int middle = left + (right - left)/2;
if( nums[middle] < target){
left = middle+1; // middle已经查过,所以left需要+1
}
if( nums[middle] > target){
right = middle; // middle已经查过,但是是左闭右开,所以right不必+1
}
if( nums[middle] == target){
return middle;
}
}
return -1;
}
};
35. 搜索插入位置 - 力扣(LeetCode)
第一想法:在while后判断target与left, right的大小,考虑是放在left or right or right+1
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while (left < right){
int middle = left + (right-left)/2;
if (nums[middle] > target) {
right = middle;
}
else if (nums[middle] < target) {
left = middle +1;
}
else {
return middle;
}
}
return left;
}
};
看完想法:没有搞清最后一步左右指针的移动,具体可以看这篇 博客
34. 在排序数组中查找元素的第一个和最后一个位置
第一想法:主体还是二分查找,但是查找到后,它是属于end还是middle还是begin,以及如何判断不是很清楚
看完想法:没看懂....
27. 移除元素
第一思路:使用双指针,快的指向要删的元素,慢的更新元素位置
看完想法:快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组;慢指针:指向更新 新数组下标的位置
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowpointer = 0;
for(int fastpointer = 0; fastpointer < nums.size(); fastpointer++){
if (nums[fastpointer] != val){
nums[slowpointer++] = nums[fastpointer];
}
else{
continue;
}
}
return (slowpointer+1); //在循环中已经移向了下一位,不用+1
}
};