虽然是刚开始进训练营,但第一天的内容还是比较轻松的。主要就是涉及到数组的知识。
704.二分查找
感受:因为之前有做过类似的题,了解过算法思路,因此今天再次做起相当于复习和巩固了。很好理解,并不难。
思路:对于给定的数组和一个目标指针,我们采用二分法就需要定义多个指针分别标记数组中间、最左端和最右端。需要注意的是解题的边界类似于数学不等式一样,有左闭右闭、左闭右开、左开右闭之分。严格来讲理解的难易程度都相同,但我们解题时要保证界限相同,从一而终。我们描述的每个判定语句都要遵从同一种边界划分。以下是我用c++写的左闭右闭的代码:
class Solution {
public:
//左闭右闭
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while(left <= right){
int middle = left + ((right - left) >> 1);
if(nums[middle] > target){
right = middle - 1;
}
else if(nums[middle] < target){
left = middle + 1;
}
else return middle;
}
return -1;
}
};
27.元素移除
感受:因为题刷的少的缘故吧,最开始看到27题时还没想到用什么方法,可能也就是暴力解法。看了卡哥视频后意识到这题有更好的做法,代码也可以更简洁。
思路:挺好理解的,双指针法。定义两个指针,这里为了形象的理解我们也像卡哥一样把两个指针称为快、慢指针。其中快指针进行遍历,扫描给定数组中每个元素;慢指针同时遍历,判断快指针是否扫描到目标元素,若没有就计数,同时快指针赋值给慢指针,相当于慢指针记录了被覆盖的目标元素的原数组下标。代码如下,十分简洁:
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];
}
}
return slow;
}
};
一句话总结:今日学时3h,总体状态良好,希望能一直坚持下去。