704. 二分查找
// c++
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size()-1, mid;
while(left <= right){
mid = left + ((right - left) >> 1);
if(nums[mid] == target) return mid;
if(nums[mid] > target) right = mid - 1;
else left = mid + 1;
}
return -1;
}
};
时间复杂度
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
空间复杂度
O
(
1
)
O(1)
O(1)
27. 移除元素
解法一 (双指针,同向走)
// c++
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0, fast = 0, end = nums.size();
for(; fast < end; fast++){
if(nums[fast]!=val) nums[slow++] = nums[fast];
}
return slow;
}
};
解法二(双指针,反向走)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i, right = nums.size()-1;
for (i=0; i<=right && right>=0; i++){
while(right>=0 && nums[right] == val) right-- ;
if (i<=right && nums[i] == val) {
swap(nums[i], nums[right]);
right--;
}
}
return right+1;
}
};
二者时空复杂度一致,虽然反向双指针是两层嵌套循环,但每个元素只访问了一次,所以时间复杂度是 O ( n ) O(n) O(n)。
同向双指针保证了数组原有顺序,反向双指针则破坏了原有顺序。
时间复杂度
O
(
n
)
O(n)
O(n)
空间复杂度
O
(
1
)
O(1)
O(1)