leetcode算法算题记录-数组--二分查找

public class 二分查找 {

    //注: 数组为有序数组且数组中无重复元素是使用二分法的前提
    //704.二分查找 简单
    //给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

    public int search(int[] nums, int target) {
        // 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        int left = 0, right = nums.length - 1;
        while (left <= right) {//小于成立时继续循环,等于成立时三个下标合一,
            int mid = left + ((right - left) >> 1);//>>位运算符 二进制数右移一位,相当于除二取商
            if (nums[mid] == target)//俩数相等则找到目标返回下标
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;//因为当前mid一定不是target所以左下标直接指向下一个
            else if (nums[mid] > target)
                right = mid - 1;//同理当前mid一定不是target所以右下标直接指向前一个
        }
        return -1;//while 循环执行完后没有找到target所以目标数组中找不到target返回-1
    }

    //35. 搜索插入位置 简单
    //给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
    //请必须使用时间复杂度为 O(log n) 的算法。
    //nums 为无重复元素的升序排列数组
    //注意在二分查找中如果没有找到目标元素那么目标元素就应该插入到最后右下标加一的位置
    public int searchInsert(int[] nums, int target) {
        //进行二分查找
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else return mid;//找到返回
        }
        return right + 1;//返回目标元素插入位置
    }

    //69. x 的平方根 简单
    //给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
    //由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
    //注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
    //注意与插入数不同数组范围发生变化,所以相对应的返回值也要变化
    public int mySqrt(int x) {
        int left = 1, right = x;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            long sum = (long) mid * mid;
            if (sum > x) {
                right = mid - 1;
            } else if (sum < x) {
                left = mid + 1;
            } else return mid;
        }
        return right;
    }


    //367. 有效的完全平方数 简单
    //给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
    //进阶:不要 使用任何内置的库函数,如sqrt 。
    public boolean isPerfectSquare(int num) {
        int left = 1, right = num;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            long sum = (long) mid * mid;
            if (sum > num) {
                right = mid - 1;
            } else if (sum < num) {
                left = mid + 1;
            } else return true;
        }
        return false;
    }

}

你可能感兴趣的:(算法学习记录,leetcode,算法,排序算法,二分查找)