二分法变形

  1. 原二分法针对需求是:在有序的数组中查找元素k
    题:比如升序数组nums={1,2,3,5,8,9}中 查询是否有k=3
    时间 O(logn)
    int search(int[] nums, int key) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid =left+(right - left)/2; //   int mid =left+((right - left)>>1)
            if (nums[mid] == key) {
                return mid;
            } else if (nums[mid] > key) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return -1;
    }
  1. 变形:在有序但有重复元素的数组中查找元素k的第一个出现index
    题:比如升序数组nums={1,2,3,3,8,9}中 查询是否有k=3
    利用两个指针来找出第一个命中index,利用循环找出边界
   int search(int[] nums, int key) {
        int left = 0;
        int right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == key) {
                right = mid;
            } else if (nums[mid] > key) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        if(nums[left] == key){
            return left;
        }
        return -1;
    }

推荐阅读更多精彩内容

  • 有序矩阵中第K小的元素 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意...
    我是小曼巴阅读 511评论 0 1
  • 上一篇我们总结了链表题目的常见题型和套路,本章我们再来看看二分。实话实说,二分的题目通常来说都比链表题目复杂一些,...
    suoga阅读 757评论 0 0
  • 1.局部最小值 给定一个数组,相邻的数不相等, 返回一个局部最小值的索引。 2.寻找两个有序数组的中位数 Lee...
    民谣真好听阅读 74评论 0 1
  • 首页目录 点击查看[https://www.jianshu.com/p/c390b7d89e35] 第一题 难度:...
    Benzic阅读 217评论 0 0
  • 二分法的使用 旋转数组: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,...
    白璞1024阅读 1,086评论 0 50
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 2,994评论 0 12
  • 夜莺2517阅读 4,734评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 3,851评论 1 5
  • 我是一名过去式的高三狗,很可悲,在这三年里我没有恋爱,看着同龄的小伙伴们一对儿一对儿的,我的心不好受。怎么说呢,高...
    小娘纸阅读 1,641评论 3 5
  • 那一年,我选择了独立远行,火车带着我在前进的轨道上爬行了超过23个小时; 那一年,我走过泥泞的柏油路,在那个远离故...
    木芽阅读 866评论 4 5