今日学习文章链接:代码随想录-数组理论基础
视频链接:
LeetCode:704
二分法
''' Python
'''
/*左闭右闭[left, right]*/
left = 0;
right = num.size - 1;
while (left <= right) {
middle = (left + right)/2
if(nums[middle] > target)
right = middle - 1;
else if (nums[middle] < target)
left = middle + 1;
else return middle;
}
return -1;
/*左闭右开[left,right)
left = 0;
right = nums.size;
while (left < right) {
middle = (left + right)/2
if(nums[middle] > target)
right = middle;
else if (nums[middle] < target)
left = middle + 1;
else return middle;
}
return -1;
二分法,边界把握不好。
## 概念
1.左闭右闭 [left, right ]
包含left和right
2.左闭右开 [left, right )
包含left不包含right
3.循环不变量
坚持左闭右闭/左闭右开原则自始至终
LeetCode27:移除元素
数组理论基础
连续很重要——数据位置删除不了,只能覆盖,[1, 2, 3, 4, 5],删除3,要把4放到3的位置,5放到4的位置,数组长度还是5。size大小会变成4,但不代表真正的空间是4.
vector.size
vector.erase O(n) 覆盖前移的工作
库函数使用
什么时候可以用——库函数只是解决问题的一小步,且我们知道内部如何实现以及时间复杂度
什么时候不可以用——用库函数可以直接,不用库函数
这道题就是实现erase删除元素的实现过程:用for循环去遍历我们的数组,遇到3,我们再用for循环一个一个地去覆盖。
两层for循环——暴力实现的,代码见参考
双指针思路,O(n)实现,一层for循环做了两层for循环要做的事情。
定义一个快指针,定义一个慢指针。
'''Python
slow = 0;
for( fast = 0; fast < nums.size; fast++) {
if(nums[fast] != val) {
nums[slow++] = nums[fast]
}
}
return slow;
'''
快指针获取新数组的元素,慢指针获取新数组元素的位置
这次听总算把算法背后的原理搞得清清楚楚啦,发现了学习算法的乐趣。