704.二分查找 27.移除元素

这篇具有很好参考价值的文章主要介绍了704.二分查找 27.移除元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LeetCode 704 二分查找

1.左闭右开

 1 public int search(int[] nums, int target) {
 2         int left = 0;
 3         int right = nums.length;
 4 
 5         if(target < nums[0] || target > nums[right - 1]){
 6             return -1;
 7         }
 8 
 9         while(left < right){
10             int middle = (left + right) >> 1;
11             if(target == nums[middle]){
12                 return middle;
13             }else if(target < nums[middle]){
14                 right = middle;
15             }else if(target > nums[middle]){
16                 left = middle + 1;
17             }
18         }
19         return -1;
20     }

 文章来源地址https://www.toymoban.com/news/detail-637388.html

2.左闭右闭

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

        if(target < nums[0] || target > nums[right]){
            return -1;
        }

        while(left <= right){
            int middle = (left + right) >> 1 ;
            if(nums[middle] == target){
                return middle;
            }else if(nums[middle] > target){
                right = middle - 1;
            }else if(nums[middle] < target){
                left = middle + 1;
            }
        }
        return -1;
    }

 

 

思路:

一(左闭右开):因为是左闭右开的区间,rigth指针的位置为待查找数组的右边界下一个位置,所以当 left < right 的状态代表我们的数组还没查尽。

二(左闭右闭):因为是左闭右闭的区间,rigth指针的位置为待查找数组的右边界位置,所以当 left <= right 的状态代表我们的数组还没查尽。

 

当我们对比了中间元素与目标的关系时,其实这时中间元素已经比较过了,我们要让我们的待查找数组把他排除在外,这也就是为什么 left = middle + 1 的原因(右边界不做举例,因为分了两种情况,其实都是一样,都是对待查找数组边界的控制)。

优化技巧: 当我们最开始进入判断的时候,我们通过数组的递增性可以判断target是否数组最小值和大于数组最大值。将这种坏情况筛选出去。

 

 

LeetCode 27 移除元素

1.快慢指针

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;
    }

 

 

思路:慢指针负责收集符合条件的元素,快指针负责查找符合条件的元素。当快指针查找到符合条件的元素交给慢指针,这时慢指针先前移动指向下一个元素(慢指针并不关心下一个元素是否符合条件,这时快指针做的事情,慢指针指向位置仅仅代表快指针查找到的下一个符合条件的元素要放到这里)。 注意:当快指针查找到不符合条件的元素时,慢指针是不动的,快指针继续向前移动,去寻找符合条件的元素。

注:题目要求返回我们"整理"后的数组的新长度(符合条件的元素的个数),这正是慢指针的值,慢指针的值其实就是慢指针的移动次数,移动一次就代表收集了一个符合条件的元素。

 

2.相向双指针

public int removeElement(int[] nums, int val) {
        int leftIndex = 0;
        int rightIndex = nums.length - 1;
        while (leftIndex <= rightIndex){
            //从后向前寻找第一个不为val的元素
            while (leftIndex <= rightIndex && nums[rightIndex] == val)
                rightIndex--;

            //从前向后寻找第一个为val的元素
            while (leftIndex <= rightIndex && nums[leftIndex] != val)
                leftIndex++;

            if (leftIndex < rightIndex){
                nums[leftIndex++] = nums[rightIndex--];
            }
        }
        return leftIndex;
    }

 

 

思路:我们使用后方不等于val的元素依次去替代前方等于val的元素。

 

注:特殊情况的考虑。

特殊情况:

当查找到最后left = rigth 的时候,如果nums[left] 等于val 这时直接返回left ,否则left需加一,同时又不能让替代语句影响我们的结果。这是

 while (leftIndex <= rightIndex && nums[rightIndex] == val)
                rightIndex--;

 while (leftIndex <= rightIndex && nums[leftIndex] != val)
                leftIndex++;

这两个while条件写法的原因所在。(这两个while语句并无先后顺序)

 

经过第一个while之后的可能:

第一种:找到了后方第一个不为val的值的索引。(该索引是有可能等于left的)

第二种(特殊):该数组在 left 处以及 left 后全是val,这时应该停止查找了。因为我们已经得出答案,返回left就好了。(此时即使进入了最后一次循环,但是修改的是right的值,left是符合条件的)

 

经过第二个while之后的可能:

第一种:找到了前方第一个为val的值的索引

第二种(特殊):该数组在 right 处以及 right 前全不是val,这时应该停止查找了。因为我们已经得出答案,返回left就好了。(因为进入了最后一次循环,这时left是比right大一的,符合全不是val的情况,直接返回left)

第三种:right 与 left的关系已经不符合条件了,代表该数组在 left 处以及 left 后都是val,我们要返回left

 

两个第一种情况用来逼近,逼近到发生特殊情况也就是两个第二种情况。

 

举例 :{3} val = 1       这时符合第一种+第二种

    {3} val = 3  这时符合第二种+第三种

    {3,2,2,3}   val = 3 这时符合第一种+第一种来逼近,一直逼近到第一种+第二种

总结:相向双指针较难,以上分析极有可能出现错误,分析思路极有可能走弯路,欢迎大家指正。

 

到了这里,关于704.二分查找 27.移除元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录Python:704. 二分查找,27. 移除元素

    数组是非常基础的数据结构。 数组是存放在连续内存空间上的相同类型数据的集合。 题目: 给定一个  n  个元素有序的(升序)整型数组  nums  和一个目标值  target   ,写一个函数搜索  nums  中的  target ,如果目标值存在返回下标,否则返回  -1 。 题目链接:. - 力扣

    2024年02月13日
    浏览(40)
  • day1-数组part01| 704. 二分查找、27. 移除元素

    数组是存放在连续内存空间上的相同类型数据的集合。 数组下标从0开始 数组内存空间的地址是连续的 1、vector是顺序容器,其利用连续的内存空间来存储元素,但是其 内存空间大小是能够改变的 。 2、array是顺序容器,其也是利用连续的内存空间来存储元素,但它的 内存空

    2024年02月05日
    浏览(33)
  • 【代码随想录算法第一天| 704.二分查找 27.移除元素】

    题目链接:二分查找 文章讲解:代码随想录.二分查找 视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili 二分前提:有序数组,数组中无重复元素 方法:结合数组的特征,可以为左闭右闭区间[0, 数组长度-1],或者左

    2024年02月16日
    浏览(33)
  • 代码随想录day1 | 704.二分查找 27.移除元素

    1、循环变量 2、判断条件 当时左闭右闭时,while循环里面的条件,我们可以先假设,有等号即有left=right的情况,例如[1,1]这个区间,那么循环是要进入里面的,所以要取得等号。 判断的时候,nums[mid]tar,那么必然tar不在右半区间,所以right=mid-1 nums[mid]tar,那么必然tar不在左半

    2024年02月15日
    浏览(52)
  • LeetCode刷题笔记-704.二分查找

     我们定义target在一个左右都是关闭的区间,[left,right] while(left = right) 这里使用= 因为left == right 是有意义的 int mid = left + ((right - left) / 2) 这么写是为了防止溢出 常用操作 当nums[mid] target 将right = mid - 1因为target 不可能在mid处取到 当nums[mid] target 将left = mid + 1

    2024年02月11日
    浏览(45)
  • 算法-二分查找、移除元素

    伪装成一个老手! 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 来源:力扣二分查找 1. Q1: 为

    2024年02月10日
    浏览(37)
  • 算法刷题Day1 二分查找+移除元素

    代码随想录-数组-1.数组理论基础 数组是存放在 连续内存空间 上的 相同类型 数据的 集合 优点:常数时间复杂度访问元素 缺点: 在删除或者增添元素的时候,就难免要移动其他元素的地址 ,时间复杂度为O(n) 代码随想录-数组-2.二分查找 前提条件 二分查找前提条件: 数组

    2024年02月10日
    浏览(42)
  • leetcode27.移除元素

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【LeetCode】 🍓希望我们一起努力、成长,共同进步。 👉题目链接 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长

    2024年02月05日
    浏览(33)
  • 【LeetCode】27. 移除元素

     题目大概意思是剔除nums数组中出现的所有val值。可以用 快慢双指针法 来做。 快的指针在前面遍历找值不为val的元素的下标,慢的负责接收值不为val的元素,并及时更新数组。  

    2024年02月14日
    浏览(35)
  • 看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题704、35、34数组二分查找) 2023.4.17

    本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!! 数组是由n(n=1)个 相同类型 的数据元素

    2024年02月05日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包