简单题14- 二分查找

描述

给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
您在真实的面试中是否遇到过这个题? 是
样例

在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。
挑战

如果数组中的整数个数超过了2^32,你的算法是否会出错?
【思路】
使用了end > start + 1是为了避免进入死循环,之后用两个if单独判断弥补,这
样避免死循环很有效
mid = start + (end - start) / 2; 防止了溢出
【代码实现】

package 二分查找;

public class Main {

    public static void main(String[] args) {
        int[] arr = { 2, 6, 8, 13, 15, 17, 17, 18, 19, 20 };
        int target = 15;
        int result = binarySearch(arr, target);
        System.out.println(result);
    }

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

    }

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,358评论 0 33
  • 1 二分查找jdk源码 时间O(logn)空间O(1) 递归式写法: 时间和空间都是O(logn) 2. 二分插入...
    少冰三hun甜阅读 3,047评论 0 1
  • 动态规划 111. 爬楼梯思路类似斐波那契数列注意考虑第 0 阶的特殊情况 272. 爬楼梯 II思路类似上题,只...
    6默默Welsh阅读 7,214评论 0 1
  • 原文出处:http://www.cnblogs.com/maybe2030/p/4715035.html引文出处:...
    明教de教主阅读 13,012评论 0 7
  • 90天的践行之旅即将结束,在践行的路上,我遇到了很多优秀的同学,也见证了他们的坚持与努力,跟他们相比,我就是龟速前...
    szobao阅读 4,436评论 0 0

友情链接更多精彩内容