牛客网刷题-二分查找

package com.example.demo.subject1;

/**
 * @version: 1.00.00
 * @description: 二分查找
 * @author: zrh
 * @date 2021/4/19 16:46
 */
public class Search {

    public static void main(String[] args) {
        int[] a = {1,2,2,4};
        Search search = new Search();
        int search1 = search.search(a, 2);
        System.err.println(search1);
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 下面的那个方法加了一些逻辑判断
     * 如果目标值存在返回下标,否则返回 -1
     * @param nums int整型一维数组
     * @param target int整型
     * @return int整型
     */
    public int search (int[] nums, int target) {
        int start = 0;
        int end = nums.length;
        int mid = (start + end) / 2;
        if(nums.length > 0 || target > nums[end-1]) {
            return -1;
        }
        while (true) {
            if(target == nums[mid] )  {
                if(mid > 0) {
                    if(nums[mid] == nums[mid -1]) {
                        end = mid;
                        mid = (start + end) / 2;
                    }else  {
                        return mid;
                    }
                } else {
                    return mid;
                }
            } else if(target > nums[mid]){
                start = mid;
                mid = (start + end) / 2;
            } else {
                end = mid;
                mid = (start + end) / 2;
            }
            if(start == end) {
                return -1;
            }
        }
    }

    /**
     * 如果数据无重复的话
     * @param nums
     * @param target
     * @return
     */
    public int simpleSearch (int[] nums, int target) {
        //开始位置
        int start = 0;
        //结束位置
        int end = nums.length;
        //中间的位置
        int mid = (start + end) / 2;
        //如果目标值比最大值大,则返回-1
        if(target > nums[end-1]) {
            return -1;
        }
        //死循环
        while (true) {
            //如果相等,则返回
            if(target == nums[mid]) {
                return mid;
                //如果目标值大于中间值,则将起始的指针设置为中间指针
                /*
                 * 如值数组为:123456
                 * 目标值为5
                 * 第一次5和3比较,5>3,则将起始位置设为3,,重新计算中间值
                 */
            } else if(target > nums[mid]){
                start = mid;
                mid = (start + end) / 2;
            } else {
                end = mid;
                mid = (start + end) / 2;
            }
            //如果起始和末尾地址相同,则代表没找到
            if(start == end) {
                return -1;
            }
        }
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值