代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、26.移出重复元素

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


Leetcode704.二分查找

提示:这里可以添加本文要记录的大概内容:

遇到的困惑点

  1. 为什么初始right值指定为right = nums.size() 还是right = nums.size() - 1?
    回答:初始指定为哪一种,根据算法使用的是左闭右闭区间,还是左闭右开区间确定。
    左闭右闭区间:使用nums.size() - 1 .Why? 因为下标都是从0开始,所以nums.size()数值多了一位,如果不减1就会有
    数组越界行为
    的风险。下图为这种异常现象:
    越界报错

    左闭右开区间:使用nums.size()

  2. 如何理解这里的左闭右闭、左闭右开区间,它们的思想是什么?
    回答:每层逼近目标值时,这层的区间这个区间是目标值存在的区间。对于区间当然会有三种不同的区间表示方式:左闭右闭、左闭右开、左开右闭。那么在使用不同的区间表示方式时便会有不同的细节点需要注意:
    (1)初始right取值
    (2)while循环条件:<还是<=
    (3)rightleft更新为middle还是middle - 1还是 middle + 1
    3.还有一个思考:至关重要
    while循环中使用<还是<=号,就已经定下了使用的是左闭右开写法,还是左闭右闭写法;可以这样理解

使用 <<===>   左闭右开写法  <===>  left = middle +1; right = middle;
使用 <=<===>   左闭右闭写法  <===>  left = middle +1; right = middle - 1;

提示:以下是本篇文章正文内容,下面案例可供参考

Leetcode27.原地删除数组元素

双指针的核心思想:通过一个快指针和一个慢指针在一个for循环里面完成两个for循环的工作。
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
注意:核心思想就是这两句话,对于快慢指针的解释。

移除重复元素

暴力破解

遇到的问题

1.数组长度为1,或者0时的情况单独讨论了
2.在双循环中,重复元素之后的元素整体前移后,没有更新外循环变量,漏掉重复元素

代码

//暴力破解
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        if(nums.size() < 2){
            return 1;
        }
        else{//数组长度大于等于2
            for(int i = 0; i < len;i++){
                if(nums[i - 1] == nums[i]){
                    for(int j = i; j < len;j++){
                        nums[j - 1] = nums[j];
                    }
                    i--;
                    len--;//更新 新数组长度
                }
            }
        }
        return len;
    }
};

双指针方式

遇到的疑惑

1.在检索相邻两个元素不相同时,我的思想总是在考虑他们两个相同的情况。没有想到从他们的对立面去考虑。使用不相同来进行判断。

核心思想

仍然是:
快指针:用与查找新数组元素,找出相邻的不相同的元素
慢指针:更新新数组,将快指针找到的新数组元素更新到新数组中

参考文献

https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值