二分法与排序数组

1. 概述

 本文主要描述二分法与排序数组的基本思想,常见题型以及思考过程。

2. 基本思想

   二分法的主要思想就是每次保留有解的一部分,舍弃掉肯定不包含答案的另一部分。

   一般在题目中,如果让你找第一个或者最后一个满足条件的位置或者值,可以考虑用二分法。

   二分法的内涵是,逐步缩小解的范围,在得到一个最小范围后,通过枚举的方法来得到最终的答案。

   这里强调的是通过二分法我实际是需要得到一个解的范围,而不是一个具体解。

   这样有助我们在临界位置进行处理,算法显得更好理解,也排除了大家在临界位置上的纠结。

3. 基本模板

   /*模板函数:

    *给定排序数组nums(从小到大排列),在nums中寻址target

    */

   public int findPosition(int[] nums, int target) {

        /*入参判断*/

        if(nums == NULL || 0 == nums.length) {

             return -1;

        }

        /*指定2个标记start 和end ,start初始指向数组第一个元素,end初始指向数组最后一个元素*/

        int start = 0;

        int end = nums.length -1;

        while(start+1 < end) { /*这样写永远不会错*/

            int mid = start+(end-start)/2; /*避免overflow*/

            if(nums[mid] == target) { /*表示找到了*/

                return mid;

            }else if(nums[mid] < target) { /*表示target在mid到end之间,那么我们需要把start指向到mid*/

                start = mid;

            }else { /*表示target在start到mid之间,那么我们需要把end指向到mid*/

                end = mid;

            }

            /*如果还没有找到target,那么现在就剩下start和end了,枚举他们是否等于target*/

            if(nums[start] == target) {

                return start;

            }

            if(nums[end] == target) {

                return end;

            }

            /*还没找到,那就是真的没了*/

            return -1;

        }

    }

转载于:https://www.cnblogs.com/sunchentong/p/5866322.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值