1、二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int L =0;
int R = nums.size() - 1;
while(L <= R){
int mid = (L + R)/2;
if(nums[mid] > target){
R = mid - 1;
}else if(nums[mid] < target){
L = mid + 1;
}else{
return mid;
}
}
return -1;
}
};
看到题目的第一印象:二分查找是非常经典的算法,自己本身有点算法基础,很轻松的就做出来了。
看完代码随想录之后的想法:以前确实没有想过还有开闭区间,虽然只有一个等号的区别,但对于边界的处理方法截然不同。
2、移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
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--;
size--;
}
}
return size;
}
};
看到题目的第一印象:在工作中常常解除到数组删除,但一般都是通过封装接口实现。我第一时间能想到的就是双for循环解决。
看完代码随想录之后的想法:双指针的方法确实巧妙,看完卡哥的讲解有种茅塞顿开的感觉。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};
今天的两道题目都比较简单,毕竟才第一天,但学习算法还是得坚持为主。以前总是半途而废,遇到困难就退缩了,希望现在有了监督能让自己坚持下去吧。