LeetCode 704 二分查找
题目链接:704.二分查找
二分法简单,细节是魔鬼,这个我是看了卡哥的视频,目前已经熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法
注意两者的异同点。
class Solution {
public:
int search(vector<int>& nums, int target) {
// int left = 0;
// int right = nums.size() - 1;
// // 左闭右闭的写法 左闭右开在下面right赋值不需要减一
// while ( left <= right ){
// // c++定义基础不牢固,定义变量要加上变量类型
// int middle = left + ( right - left ) / 2; //防止溢出
// if ( nums[middle] > target ){
// right = middle -1;
// }
// else if ( nums[middle] < target ){
// left = middle + 1;
// }
// else{
// return middle;
// }
// }
// return -1;
// 左闭右开写法
int left = 0;
int right = nums.size();
// 左闭右闭的写法 左闭右开在下面right赋值不需要减一
while ( left < right ){
// c++定义基础不牢固,定义变量要加上变量类型
int middle = left + ( right - left ) / 2; //防止溢出
if ( nums[middle] > target ){
right = middle;
}
else if ( nums[middle] < target ){
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
};
- 时间复杂度:O(log n ),其中 n是数组的长度。
- 空间复杂度:O(1)
LeetCode 27 移除元素
题目链接:27.移除元素
思路:这个题就相当于让实现库函数erase。
暴力解法和双指针解法两种
暴力解法使用两层for ,第一层遍历整个数组,第二层用来更新覆盖数组 O(n^2) O(1)
双指针法定义两个指针,fast指针用来遍历数组找到target,slow指针用来更新数组中的元素从而实现覆盖 O(n) O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
// 双指针法
int slow = 0;
for ( int fast = 0; fast < nums.size(); fast++){
if ( nums[fast] != val){
nums[slow] = nums[fast];
slow += 1;
}
}
return slow;
// // 暴力解法
// int size = nums.size();
// for (int i = 0; i < size; i++) {
// if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
// for (int j = i + 1; j < size; j++) {
// nums[j - 1] = nums[j];
// }
// i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
// size--; // 此时数组的大小-1
// }
// }
// return size;
//暴力中的i--是因为覆盖后下标i以后的数值都向前移动了一位,如果i不向前移动,就会导致无法删除两个相邻的val eg:[1,2,2,3,4] 2
}
};
// 其次要注意本题的返回值