704:二分查找
题目链接:
文章讲解:代码随想录
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
1看到题目后自己的第一想法是暴力解决
2看完代码随想录后,可以用更优的算法去解决这道题,分治法
3难点是一开始while循环不是很确定要不要<=, 不是很清楚
区间的定义
4学完后更加了解左闭右开,左闭右闭 两种区间规则
5代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left <= right)
{
int mid = (left+right)/2;
if(nums[mid] > target)
{
right = mid-1;
}
else if(nums[mid] < target)
{
left = mid+1;
}
else
{
return mid;
}
}
return -1;
}
};
27:移除元素
- 自己看到题目的第一想法,暴力解决,双层for循环
- 看完代码随想录之后的想法 ,用到双指针,代码更加简洁,运行时间提高了,很巧妙的思路
- 自己实现过程中遇到哪些困难 ,暴力解法时,很容易忘记数组往前移了,i也要跟着往前移动一步
- 今日收获,更加了解数组,往后碰到数组,可以考虑用双指针
- 代码
-
class Solution { public: int removeElement(vector<int>& nums, int val) { int slowindex=0; int fastindex; for(fastindex=0; fastindex < nums.size(); fastindex++) { if(val!=nums[fastindex]) { nums[slowindex++]=nums[fastindex]; } } return slowindex; } };
今日干货
-
数组是存放在连续内存空间上的相同类型数据的集合。
需要两点注意的是
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
-
数组的元素是不能删的,只能覆盖(往前移动)
正是因为数组的内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。