(*第一次写博客qwq)
1. 704二分查找
题目:
以我浅薄的知识,第一反应是从左往右一个一个找。。。写完以后发现英文版的题目多了一句话:
好。 重新写。
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)/2; //听说写成 middle=(right-left)/2 + left 可以防止溢出 if (nums[middle] == target) { return middle; } else if (nums[middle] < target) { //mid在target左边 left = middle + 1; } else { right = middle - 1; //mid在target右边 } } return -1; } };
一开始while的条件写错了,写成了(left<right)。看了讲解才知道题目可以用两种方法做。
方法一:
左闭右闭(上图代码)。即包括left也包括right。比较好理解。
方法二:
左闭右开,即包括left,但是不包括righ。
while的条件为(left<right)。
当middle<target,left=middle+1,和左闭右闭一样。
当middle>target,left=middle,因为右开,所以取不到middle,取到的是middle-1。
用方法二我其实有个疑问,如果 nums=[1], taeget=1, 就进入不了(left<right),结果就return -1,但是应该return 1。待解决。。。
2. 24移除元素
有点小困,来不及学了。等睡完明天一起学。第一次的博客就先这样惹qwq
---------------------------------------------------------------------------------------------------
10.13更新:
题目:
第一反应还是从左往右遍历,碰到=val的直接删除,然后发现好像没有直接删除的函数。。。原因:数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
好。重新写(其实是看来讲解才写出来的)。两个方法:
方法一:
用两个指针。我一直因为只有pointer才算指针,所以看到讲解用俩指针,我be like:题目都没给linked list哪来的指针= =
回到正题。定义两个指针left=0和right。
当nums[right] != val,把right的值复制到left(nums[left] = nums[right]),left+1。
当nums[right]==val,right往右移一个,如果还等于val,就一直右移到不等于val。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0;
for (int right=0; right<nums.size(); right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
};
至于为什么return left能输出一个数组还是不理解,希望以后能搞懂。
方法二:
也是两个指针。left=0,right=nums.size()
如果nums[left] == val,就把nums[right-1]复制过去。一开始我写的是nums[right],然后发现超出数组范围了。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0, right=nums.size();
while (left < right) {
if (nums[left] == val) {
nums[left] = nums[right-1];
right--;
}
else {
left++;
}
}
return left;
}
};
day1内容就这样了,没有完成拓展,24也拖了一天才搞完,但是好歹也完成了。希望自己能多坚持几天 ovo