代码随想录刷题|LeetCode 704 二分查找、27 移除元素

目录

704 二分查找

思路:

二分查找:

左闭右开的写法:

左闭右闭的写法:

27 移除元素

思路:

移除元素            

暴力解法:

双指针(快慢指针):


704 二分查找

题目链接:力扣

思路:

        查找目标值的方法有很多种,根据数据的关系和题目的要求选择最合适的查找方法,才能让查找更加高效

        这道题目的介绍到——“有一个有序无重复元素的数组”,其中有两个条件:1).有序 2).无重复

        有序才能更好地使用二分法,要不然数据是乱的,没有办法用二分法查;无重复是每一个下标上地值都是唯一的

        这两个条件是使用二分查找的条件,遇到这两个前提条件可以考虑一下二分查找

二分查找:

        有序的数组,查找某一个值,就是将数组劈成两半,与中间值对比,会出现三种情况:

                1).跟中间值相同 —— 就是要找的目标

                2).比中间值大 —— 目标值在数组右半边

                3).比中间值小 —— 目标值在数组左半边

        知道了怎么查找,还有一个细节需要注意:那就是下标的范围,在这里有两种情况:

                1).左闭右开

                2).左闭右闭

        这两种写法的左边都是封闭的,只有右边有两种情况,所以取决于你想不想让右边的下标有意义

左闭右开的写法:

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length;

        // 根据左闭右开的原则,right是数组的长度,这个下标是取不到的
        while (left < right) {
            // 每次循环都判断出中间值
            int mid = left + ((right - left) >> 1);
            if ( nums[mid] > target) {
                // 如果中间值大于目标值,说明目标值在左边,需要继续查找数组的左半边,只需要将右下标移到中间位即可
                // right这边是开,是在数组上取不到,mid已经判断过了,不需要再取到,所以给mid贴上right标签
                right = mid;
            }  else if (nums[mid] < target) {
                // 如果中间值小于目标值,说明目标值在右边,需要继续查找数组的右半边,只需要将左下标移到中间位即可
                // left这边是闭,是在数组上可以取到的,mid已经判断过了,得在往前上一位
                left = mid + 1;
            }  else {
                // 如果这个中间值是目标值就返回下标
                return mid;
            }
        }
        return -1;
    }
}

左闭右闭的写法:

class Solution {
    public int search(int[] nums, int target) {

        int left = 0;
        int right = nums.length - 1;

        // 根据左闭右闭原则,在每次查找得过程中,left和right下标位置上的数字都是可以查到的
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if ( nums[mid] > target ) {
                // 如果中间值大于目标值,说明目标值在左边,需要继续查找数组的左半边,只需要将右下标移到中间位即可
                // right这边是闭,是在数组上可以取到的,mid已经判断过了,不需要再取到,所以mid - 1
                right = mid - 1;
            } else if (nums[mid] < target) {
                // 如果中间值小于目标值,说明目标值在右边,需要继续查找数组的右半边,只需要将左下标移到中间位即可
                // left这边是闭,是在数组上可以取到的,mid已经判断过了,得在往前上一位
                left = mid + 1;
            }  else {
                // 如果这个中间值是目标值就返回下标
                return mid;
            }

        }

        return -1;
    }
}

27 移除元素

题目:力扣

思路:

        说起移除:我们首先想到的是,直接将这个目标删除就可以,但是对于数据来说,删除了元素,后面的元素不会自动补位,所以需要将删除位置后后面得元素整体向前移动一位,就需要再来一次循环,这也是暴力解法

        上面的思路是将不要的覆盖/剔除,还有一种就是将要的留下来,使用双指针,可以一个指针在前面检测,另一个指针在后面记录

移除元素            

暴力解法:

第一步:遍历数组(外层for循环)

第二步:找到目标值(if判断)

第三步:将目标值后面的数组整体向前移(内层for循环)

第四步:将数组的长度减1;再次循环这个下标

注:这里有一个小细节就是,将后面的数据整体移前之后,这个下标的元素没有判断过,还得再判断一次这个下标

class Solution {
    public int removeElement(int[] nums, int val) {

        int size = nums.length;

        // 从数组的第一个元素开始进行比较
        for (int i = 0 ; i < size ; i++) {
            // 判断是否有元素等于要删除的值
            if (nums[i] == val) {
                // 找到目标值后进行处理,就是怎么将这个元素处理了
                // 把后面的数组整体往前移,又是一套循环
                for (int j = i; j < size - 1; j++) {
                    nums[j] = nums[j+1];
                }
                i--; // 刚才,这个进if判断的数字的下标上的数字已经被后面的数字覆盖了,要重新进行判断,所以要减一下下标 
                size--;
            }
        }
        return size;
    }
}

双指针(快慢指针):

这个像是暴力解法的逆向思维:暴力解法是像挤掉我不要的,双指针是像保留下我要的

class Solution {
    public int removeElement(int[] nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0 ; fastIndex < nums.length ; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
<h3>回答1:</h3><br/>1. 首先,你需要在VS Code中安装LeetCode插件。打开VS Code,点击左侧的“扩展”图标,搜索“LeetCode”,然后点击“安装”按钮。 2. 安装完成后,你需要登录你的LeetCode账号。点击左侧的“LeetCode”图标,然后点击“登录”按钮。输入你的LeetCode账号和密码,然后点击“登录”按钮。 3. 登录成功后,你可以开始刷题了。点击左侧的“LeetCode”图标,然后点击“题库”按钮。在题库中选择你想要刷的题目,然后点击“开始”按钮。 4. 在刷题过程中,你可以使用VS Code提供的一些功能,比如自动补全、代码提示、代码格式化等。这些功能可以帮助你更快地完成题目。 5. 刷完题目后,你可以提交你的代码并查看测试结果。点击左侧的“LeetCode”图标,然后点击“提交”按钮。输入你的代码,然后点击“提交”按钮。稍等片刻,你就可以看到测试结果了。 总之,使用VS Code安装LeetCode插件刷题非常方便,可以帮助你更快地提高算法能力。 <h3>回答2:</h3><br/>VS Code是一个很流行的开发工具,LeetCode是很多程序员用来刷算法题的平台。在VS Code中安装LeetCode插件可以提供更好的刷题体验,还可以方便地保存和管理自己的代码。 下面是以Windows系统为例介绍在VS Code中安装LeetCode插件的步骤: 第一步:安装VS Code 在官网下载安装VS Code,https://code.visualstudio.com/ 第二步:打开Extensions标签 点击左侧菜单栏中的Extensions标签,在搜索框中输入“LeetCode”。 第三步:安装LeetCode插件 在搜索结果中,找到LeetCode插件并点击“Install”安装。 第四步:配置LeetCode插件 安装完毕后,配置LeetCode插件。点击左侧菜单栏中的“LeetCode”标签,根据提示进行配置。 第五步:使用LeetCode插件 在左侧菜单栏中的“LeetCode”标签下,点击“Problems”即可进入刷题页面。 总结:安装LeetCode插件可以为刷题提供更好的开发环境和代码管理工具,操作简便,适合程序员们使用。 <h3>回答3:</h3><br/>VSCode是一款功能强大的代码编辑器,不仅支持多种编程语言,还能通过插件进行扩展,其中包括LeetCode刷题插件。安装LeetCode插件,可以大大提升刷题效率和舒适度。安装LeetCode插件,大致可以分为以下几个步骤: 1. 安装VSCode:首先需要下载并安装VSCode,可以从官网(https://code.visualstudio.com/)获取。 2. 安装LeetCode插件:在VSCode中打开“扩展”选项卡,搜索“LeetCode”,找到对应的插件,点击“安装”。 3. 配置LeetCode插件:在VSCode中点击左下角的“LeetCode插件设置”按钮,进入插件的配置页面。在这里可以设置LeetCode的默认语言、代码保存目录、登录账号等信息。 4. 登录LeetCode账号:在配置页面中设置好账号信息后,可以点击登录按钮,跳转到LeetCode的官网,进行账号登录。 5. 开始刷题:在LeetCode插件的“输入问题编号”处输入题目编号,点击“搜索”即可进入题目页面,进行刷题操作。LeetCode插件还提供了多种题目操作,如代码提交、答案对比、题目复制等功能,可根据需求进行使用。 总之,安装LeetCode插件需要一些简单的操作步骤和注意事项,但对于提高刷题效率来说是非常方便实用的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

symdunstaz

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值