代码随想录算法训练营Day-1|704二分法、27、移除元素

今日学习文章链接:代码随想录-数组理论基础

视频链接:

代码随想录-B站视频讲解 27 移除元素
代码随想录-B站视频讲解-704 二分查找法|二分搜索法

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;

'''
快指针获取新数组的元素,慢指针获取新数组元素的位置

这次听总算把算法背后的原理搞得清清楚楚啦,发现了学习算法的乐趣。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值