ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Lintcode 二分查找

2022-07-14 07:31:08  阅读:153  来源: 互联网

标签:二分 end target int Lintcode mid start 查找 数组


14 · 二分查找 算法 简单 通过率39%   题目 题解 笔记 讨论 排名 描述

给定一个排序的整数数组(升序)和一个要查找的整数 target,用O(logn)O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1

样例

样例 1:

输入:

数组 = [1,4,4,5,7,7,8,9,9,10]
target = 1

输出:

0

解释:

第一次出现在第0个位置。

样例 2:

输入:

数组 = [1, 2, 3, 3, 4, 5, 10]
target = 3

输出:

2

解释:

第一次出现在第2个位置

样例 3:

输入:

数组 = [1, 2, 3, 3, 4, 5, 10]
target = 6

输出:

-1

解释:

没有出现过6, 返回-1

挑战

如果数组中的整数个数超过了2^{32}232,你的算法是否会出错?

 

题解:

mid是 start 和 end中间的数字

让start 和 end保持2个数字或以上的间隔

如果mid的值和target相等, 那么mid的值赋给end, 让循环继续

直至start和end的间距小于等于2, 那么就可以直接锁定数据的范围

target的位置就是start 或者 end, 或者不存在 返回-1

package lint;

import org.junit.Assert;
import org.junit.Test;

public class BinarySearch2 {
    public int binarySearch(int[] nums, int target) {
        int start = 0;
        int end = nums.length-1;
        int mid = -1;
        while(start+1<end){
            mid = start + (end-start)/2;
            System.out.println("in while : mid:"+mid+ ", start:"+start + ", end:"+end);
            if(nums[mid]>=target){
                end = mid;
            }else if(nums[mid]<target){
                start = mid;
            }
        }
        System.out.println("out while : mid:"+mid+ ", start:"+start + ", end:"+end);
        if(nums[start]==target){
            return start;
        }else if(nums[end]==target){
            return end;
        }
        return -1;
    }

    @Test
    public void test1() {
        Assert.assertEquals(3, new BinarySearch2().binarySearch(new int[]{3,4,5,8,8,8,8,10,13,14}, 8));
    }
    @Test
    public void test2() {
        Assert.assertEquals(2, new BinarySearch2().binarySearch(new int[]{1, 2 ,3, 4}, 3));
    }

    @Test
    public void test3(){
        Assert.assertEquals(3, new BinarySearch2().binarySearch(new int[]{1, 2 ,3, 4}, 4));
    }

    @Test
    public void test4(){
        Assert.assertEquals(3, new BinarySearch2().binarySearch(new int[]{1, 2 ,3, 4,4, 4, 5}, 4));
    }
}

 

标签:二分,end,target,int,Lintcode,mid,start,查找,数组
来源: https://www.cnblogs.com/appinn/p/16476192.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有