从头开始,重新再来,但是又不完全一样,之前是擅长的python,现在是C++,能坚持下来么?
704. 二分查找
704. 二分查找https://leetcode.cn/problems/binary-search/
上次写这道题已经是两个月之前,说真的,没想起来,惭愧~
这里简述一下两种方法吧
1.左闭右闭
a.right是总长度减去1,右边的值是真实存在的
b.left <= right,同a,不能 <,右边的值是真实存在的
c.num[mid] > target,mid = right - 1
d.num[mid] > target,mid = left + 1
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while (left <= right)
{
int mid = (right + left) / 2;
if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid - 1 ;
else
return mid;
}
return -1;
}
};
//C
int search(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (*(nums + mid) < target)
left = mid + 1;//target 在左区间,所以[left, middle - 1]
else if(*(nums + mid) > target)
right = mid - 1; // target 在右区间,所以[middle + 1, right]
else
return mid;
}
return -1;
}
2.左闭右开
a.right是总长度,右边的值指向数组后的第一个位置
b.left < right,不能 <=,等于没有作用
c.num[mid] > target,mid = right
d.num[mid] > target,mid = left + 1
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while (left < right)
{
int mid = (right + left) / 2;
if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid;
else
return mid;
}
return -1;
}
};
int search(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize;
while (left < right)
{
int mid = (left + right) / 2;
if (*(nums + mid) < target)
left = mid + 1; // target 在右区间,在[middle + 1, right)中
else if(*(nums + mid) > target)
right = mid; //target 在左区间,在[left, middle)中
else
return mid;
}
return -1;
}
27. 移除元素
27. 移除元素https://leetcode.cn/problems/remove-element/
双指针法,这个没什么好说的
补充一些卡哥对快慢指针的定义
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int index = 0;
int st = 0;
int cnt = size(nums) - 1;
while (st <= cnt)
{
if (nums[st] != val){
nums[index++] = nums[st];
}
st++;
}
return index;
}
};