#Leetcode 704 二分查找#
## 题目链接:Leetcode704二分查找
文档讲解:代码随想录-二分查找
视频讲解 :代码随想录-
解题思路:通过分段查找减小时间复杂度,前提是数组本身是由次序。二分查找分为两种查找方式,一种是左闭右闭,一种是左闭右开;我个人习惯使用左闭右闭。需要注意的就是while循环中是否边界可以取等和中right取middle还是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) / 2;
if(nums[middle] == target)
return middle;
if(nums[middle] < target)
left = middle+1;
else
right = middle;
}
return -1;
}
};
本题的变体会是一些求解使用二分查找方法的其他问题,如Leetcode35和Leetcode34,一般来说最后结果可能会是其中某一步的middle或者是right的某一个关系式,这取决最后循环结束后结果与right是有怎样的位置关系。
# Leetcode 27删除元素--双指针法
题目链接:Leetcode27 删除元素
视频讲解:代码随想录-删除元素-b站
原始思路:暴力求解,就是两层嵌套循环。这个不多说,代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
int i = 0;
while(i< len)
{
if(nums[i] != val)
{
i++;
continue;
}
else{
for(int j = i; j< len - 1;j++)
nums[j] = nums[j+1];
len--;
}
}
return len;
}
};
这个方法有一个小注意点,i不是每次循环都加1的,当遇到要删除元素时,i应该不变,防止要连续删除元素。此种方法的时间复杂度最差情况为n的平方。
看完代码随想录视频讲解后,使用了双指针法,运用了块指针和慢指针,这样就可以记录已经遍历到的位置和不删除元素组成的数组的最后一个元素的位置,最后的时间复杂度为O(n).
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast = 0;
int slow = 0;
int len = nums.size();
for(;fast < len; fast++)
{
if(nums[fast] != val)
nums[slow++] = nums[fast];
else
{
continue;
}
}
return slow;
}
};