题目 1:704. 二分查找
纯暴力解法
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;
}
};
心路历程:这里注意return, 本来想在if下面加个else的,但其实逻辑不对,如果数组里第一个数不等于target那么就直接return-1了
二分法
左闭右闭版[ , ]
class Solution {
public:
int search(vector<int>& nums, int target) {
int start = 0; // 数组起始索引
int end = nums.size()-1; // 数组终止索引
while(start <= end)
{
int mid = (start + end) / 2;
if (target > nums[mid])
{
start = mid + 1;
}
else if (target < nums[mid])
{
end = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
};
心路历程:二分法区间的考虑真的很重要!!!如果start = mid; end = mid; 不进行+-1操作,那么可能导致死循环跳不出while循环(例:start=3;end=4;那么mid=3,如果nums不等于target那么一直进入循环)
左闭右开版[ , )
class Solution {
public:
int search(vector<int>& nums, int target) {
int start = 0;
int end = nums.size() - 1;
// if(end==0){end=1;}
if(nums[end]==target){return end;} // 修复bug 如用例 [3,5] val=5; [5] val=5;
while(start < end)
{
int mid = (start + end) / 2;
if(target > nums[mid])
{
start = mid + 1;
}
else if(target < nums[mid])
{
end = mid;
}
else
{
return mid;
}
}
return -1;
}
};
心路历程:其实左开又闭,仅需要 int end = nums.size();就能确保考察到数组最后一个元素了。
题目二:27. 移除元素
自己的解法(其实也是双指法)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int count = 0;
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] == val)
{
count ++; // 截至当前等于val元素个数
}
else
{
nums[i-count] = nums[i]; // 将当前不等于val元素 覆盖到重复元素所在位置
}
}
return nums.size() - count;
}
};
双指针法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for(int i = 0; i<nums.size(); i++)
{
if(nums[i] != val)
{
nums[slow] = nums[i]; // 如果当前元素不等于val 那么将当前元素赋值给慢指针
slow ++;
}
}
return slow;
}
};
心路历程:慢指针slow +1其实就是当前满足条件元素的个数,因此slow就应该是当前满足条件元素的索引位置。