码迷,mamicode.com
首页 > 其他好文 > 详细

第二节.二分法

时间:2016-09-04 16:01:23      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:

总结:

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.熟练此模板,对于其他的二分查找问题,只需要根据题意改变缩小区间的条件即可。

 

 

第二节.二分法

标签:

原文地址:http://www.cnblogs.com/coldyan/p/5839388.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!