学习资料链接
programmercarl.com/%E6%95%B0%E…
704.二分查找
第一想法
二分查找在很多教程中都看过,解题的思路是有的,于是直接在leetcode中写了起来,第一次提交,结果错误,发现由于人比较迷糊,返回了nums[middle],重新提交后发现超时,第一次提交源码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = 0;
int high = nums.size() - 1;
while (low < high) {
int middle = (low + high) / 2;
if (nums[middle] == target) {
return middle;
} else if (nums[middle] > target ) {
high = middle;
} else {
low = middle;
}
}
return -1;
}
};
看完随想录的收获
完美的击中了我犯得所有错误,两个重要的知识点记录如下:
- 注意整数越界问题.
- 数组边界问题的两种写法.
重新提交版
左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = 0;
int high = nums.size() - 1;
while(low <= high) {
int middle = (low + high) / 2;
if (nums[middle] > target) {
high = middle - 1;
} else if (nums[middle] < target) {
low = middle + 1;
} else {
return middle;
}
}
return -1;
}
};
左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = 0;
int high = nums.size();
while(low < high) {
int middle = (low + high) / 2;
if (nums[middle] > target) {
high = middle;
} else if (nums[middle] < target) {
low = middle + 1;
} else {
return middle;
}
}
return -1;
}
};
35.搜索插入位置
提交解法
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int low = 0;
int high = nums.size() - 1;
if (target > nums[high]) {
return high + 1;
}
if (target < nums[low]) {
return 0;
}
while (low <= high) {
int middle = low + (high - low) / 2;
if ( nums[middle] > target) {
high = middle - 1;
} else if ( nums[middle] < target) {
low = middle + 1;
} else {
return middle;
}
}
return low;
}
};
注意点和需要优化的地方
- 最终返回low
- 前面两个if实际上可以在下面中体现,参考官方题解的方法.
27. 移除元素
第一想法
第一想法是遍历数组,然后看元素是否等于目标值,如果不等于就加入新数组中,但是仔细看题目发现不让用额外的空间,于是如下: 遍历数组,然后元素是否等于目标值,如果等于的话,从这个元素开始往后寻找,找到的第一个不等于目标值的元素,两者交换,并且一旦找到就停止
第一次提交
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int temp = 0;
int count = 0;
for(int i = 0; i < nums.size(); i++) {
if (nums[i] == val){
for(int j = (i+ 1); j < nums.size(); j++){
if (nums[j] != val) {
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
break;
}
}
}
}
for(int i = 0; i < nums.size(); i++) {
if (nums[i] != val) {
count++;
}
}
return count;
}
};
看完题解后的收获
看到题解双指针仨字的时候,就突然想起来咋做了,有点子尴尬....
今日份收获
两个套路:
- 数组边界的确定
- 双指针