可信专业级挂了,在极度红温的情况下报名训练营,重新做人。发誓每天下班后做2h算法题(如果10点前到家的话)
今天下班到家,天色已晚。内容也比较基础,所以简单记录,不再详细记录理论。
LC 704 二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0;
int r = nums.size() - 1;
//本题比较基础,已经排序,遇到相似可以先排序再二分
while (l <= r) {
int m = (l + (r - l) / 2);//这种写法是防止越界的常规写法,也可写作l + (r - l) >> 1,效果一样
if (nums[m] > target) r = m - 1;//若m大于目标,说明目标一定不在[m,r]的区间内,可以直接把r置为m - 1;
else if (nums[m] < target) l = m + 1;//同理
else return m;
}
return -1;
}
};
LC27 移除元素
1.两层for暴力解
没啥好说的,两层for就完事。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
for (int i = 0; i < n; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < n; j++) {
nums[j - 1] = nums[j];
}
i--;
n--;
}
}
return n;
}
};
2. 双指针
主要问题是,目前自己不容易想到这种解法,实际让我自己做的话,可能真就暴力法完事了。
反思:双指针/快慢指针常用于数组操作,遇到类似题目可以往这方面考虑下
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++) {
if (val != nums[fast]) {
nums[slow++] = nums[fast];
}
}
return slow;
}
};