剑指 Offer 53 - I. 在排序数组中查找数字 I

这篇具有很好参考价值的文章主要介绍了剑指 Offer 53 - I. 在排序数组中查找数字 I。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目来源
剑指 Offer 53 - I. 在排序数组中查找数字 I

二分查找

初始化: 左边界 i=0 ,右边界 j=nums.length−1。
循环二分: 当闭区间 [i, j] 无元素时跳出;

  • 计算中点 m=(i+j)/2 (向下取整);
  • 若 nums[m]<target,则 target 在闭区间 [m+1,j] 中,因此执行 i=m+1;
  • 若 nums[m]>target,则 target 在闭区间 [i,m−1] 中,因此执行 j=m−1;
  • 若 nums[m]=target,则右边界 right 在闭区间 [m+1,j] 中;左边界 left 在闭区间 [i,m−1] 中。因此分为以下两种情况:
    • 若查找 右边界 right ,则执行 i=m+1;(跳出时 i 指向右边界)
    • 若查找 左边界 left ,则执行 j=m−1;(跳出时 j 指向左边界)

返回值: 应用两次二分,分别查找 right 和 left ,最终返回 right−left−1 即可。

求比target大的值

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

剑指 Offer 53 - I. 在排序数组中查找数字 I

求比taget小的值

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

剑指 Offer 53 - I. 在排序数组中查找数字 I
最终直接l-r-1即可,完整代码

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        while(left <= right){
            int mid = left + ((right-left)>>1);
            if(nums[mid] <= target){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        int r = left;
        if(right >= 0 && nums[right] != target) return 0;
        left = 0;
        right = nums.length-1;
        while(left <= right){
            int mid = left + ((right-left)>>1);
            if(nums[mid] < target){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        int l = right;
        return r - l - 1;
    }
}

剑指 Offer 53 - I. 在排序数组中查找数字 I文章来源地址https://www.toymoban.com/news/detail-427595.html

到了这里,关于剑指 Offer 53 - I. 在排序数组中查找数字 I的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 剑指 Offer 53 - II. 0~n-1 中缺失的数字

    力扣 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例 1: 输入: [0,1,3] 输出: 2 示例 2: 输入: [0,1,2,3,4,5,6,7,9] 输出: 8 限制: 1 = 数组长度 = 10000 代码:

    2024年02月14日
    浏览(64)
  • 剑指offer -- 二维数组中的查找

    二维数组中的查找_牛客题霸_牛客网 (nowcoder.com) 暴力查找法: 是一种简单直接的解决方法,可以用于在二维数组中查找目标值。该方法的思路是遍历数组的每个元素,逐个与目标值进行比较。 具体步骤如下: 从数组的第一行第一列开始,逐行逐列地遍历数组的每个元素。 对

    2024年02月06日
    浏览(90)
  • 剑指offer中算法:二维数组中的查找

    在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例 现有矩阵 matrix 如下: { {1, 4, 7}, {2, 5, 8,}, {3, 6, 9} } 给定 target = 9,

    2024年02月12日
    浏览(43)
  • 【剑指offer刷题记录 java版】数组双指针 之 其它题目

    本系列文章记录labuladong的算法小抄中剑指offer题目 题目链接:https://leetcode.cn/problems/XltzEq/ 题目链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/ 题目链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/ 题目链接:https://leetcode.cn/problems/he-wei-sde-

    2024年02月11日
    浏览(48)
  • 剑指 Offer 14- I. 剪绳子

    剑指 Offer 14- I. 剪绳子 难度: m i d d l e color{orange}{middle} mi dd l e 题目描述 给你一根长度为 n n n 的绳子,请把绳子剪成整数长度的 m m m 段(m、n都是整数,n1并且m1),每段绳子的长度记为 k [ 0 ] , k [ 1 ] . . . k [ m − 1 ] k[0],k[1]...k[m-1] k [ 0 ] , k [ 1 ] ... k [ m − 1 ] 。请问 k [ 0 ] ∗

    2023年04月09日
    浏览(41)
  • 剑指 Offer 58 - I. 翻转单词顺序

    剑指 Offer 58 - I. 翻转单词顺序 不用内置方法 去除首尾空格和中间多余空格 翻转所有字符 翻转每个单词 用自带的 trim() 和 substring() ,要自己实现这两个方法也很简单。

    2024年02月11日
    浏览(35)
  • 【剑指 offer】旋转数组的最小数字

    ✨个人主页:bit me👇 ✨当前专栏:算法训练营👇 核心考点:数组理解,二分查找,临界条件 描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这

    2023年04月20日
    浏览(52)
  • 【剑指offer】数组中重复的数字

    👑专栏内容:力扣刷题 ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 剑指offer:数组中重复的数字 在一个长度为 n 的数组里的所有数字都在 0 0 0 到 n − 1 n-1 n − 1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几

    2024年01月20日
    浏览(50)
  • 剑指offer03.数组中重复的数字

    看到这道题的第一眼想到的是先给它排序,然后双指针从左往右遍历,写了一个冒泡排序,但是我想到了应该会超时,因为冒泡时间复杂度是n的平方,输入大小时10000,肯定会超时,然后右又看了一下题目看到数字都是0-n-1,灵感一下子就来了,我先创建一个等大的自然数数

    2024年02月11日
    浏览(40)
  • 剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 利用题目的限制条件: 所有数字都在 0~n-1 的范围内 通过交互让数字和下标一一对应,如果有多个数字对应同一个下标,那就找到了答案。 另一种写法

    2024年02月11日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包