zoukankan      html  css  js  c++  java
  • 第二节.二分法

    总结:

    1什么时候使用二分法?

    当要求使用比O(n)还要低的时间复杂度时,只能是O(lgn)。通常对应二分法和倍增法。

    2二分法模板:

            首先看一个经典的二分查找问题:

            在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1

           样例

      给出数组 [1, 2, 2, 4, 5, 5].

    • 对于 target = 2, 返回 1 或者 2.
    • 对于 target = 5, 返回 4 或者 5.
    • 对于 target = 6, 返回 -1.

          代码:

    public class Solution {
        public int findPosition(int[] nums, int target) {
            if (nums == null || nums.length == 0) {
                return -1;
            }
            
            int start = 0, end = nums.length - 1;
            while (start + 1 < end) {
                int mid = start + (end - start) / 2;
                if (nums[mid] <= target) {
                    start = mid;
                } else {
                    end = mid;
                }
            }
            
            if (nums[start] == target) {
                return start;
            }
            if (nums[end] == target) {
                return end;
            }
            return -1;
        }
    }

    上面模板中需要注意:

    1.while循环条件 start+1<end 可以保证循环内start和end不相邻,从而避免死循环。

    2.mid = start+(end-start)/2 可以防止溢出。

    3.每次的更新要使用 start = mid 或 end = mid。

    4.前面的while循环目的是缩小查找区间,直到start和end相邻,因此while里面可以不return。

    5.熟练此模板,对于其他的二分查找问题,只需要根据题意改变缩小区间的条件即可。

    需关注此模版以下几个特性:

    (1)数组len=1时,start与end重合,len>=2时,最后start与end一定是相邻的;

    (2)如果要找的target有重复元素,则start与end一定在其左边界或右边界上;

    (3)如果数组中不存在要找的target,则其插入位置只可能在最终start的左边,中间,或者右边。

  • 相关阅读:
    AtCoDeer and Election Report
    乒乓球
    dp(装箱)
    《非你莫属》面试者现场跟面试官用英文对话,一口流利的英语口语厉害了
    冬天喝酸奶,可以加热吗?冬天喝酸奶,这4个方面要注意
    滑县两个富豪打赌,一人吃了一泡狗屎
    为什么外国富豪都喜欢捐光所有财产
    发的微博有敏感词
    社交网络
    怎么把word中的文字拉细变瘦长
  • 原文地址:https://www.cnblogs.com/coldyan/p/5839388.html
Copyright © 2011-2022 走看看