1.LeetCode算法题-数组-二分查找相关

目录

1.二分查找

2.搜索插入位置

3.在排序数组中查找元素的第一个和最后一个位置

4.x的平方根

5.有效的完全平方数


1.二分查找

地址:704. 二分查找 - 力扣(LeetCode)

题目:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1

提示:

你可以假设 nums 中的所有元素是不重复的。 n 将在 [1, 10000]之间。 nums 的每个元素都将在 [-9999, 9999]之间。

答案:

class Solution {
    public int search(int[] nums, int target) {
        if(targetnums[nums.length-1]){
            return -1;
        }
        int left=0;
        int right=nums.length-1;
        while(right>=left){
            int mid=(left+right)/2;
            if(target==nums[mid]){
                return mid;
            }else if(target>nums[mid]){
                left=mid+1;
            }else if(target

解题思路:代码随想录 (programmercarl.com)

2.搜索插入位置

地址:35. 搜索插入位置 - 力扣(LeetCode)

题目:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5 输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2 输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7 输出: 4

提示:

1 <= nums.length <= 104 -104 <= nums[i] <= 104 nums 为 无重复元素 的 升序 排列数组 -104 <= target <= 104

答案:

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        while(right>=left){
            int mid=(left+right)/2;
            if(target==nums[mid]){// 1. 目标值等于数组中某一个元素  return mid;
            return mid;
            }else if(targetnums[mid]){
                left=mid+1;
            }
        }
        //当right=left-1时跳出while循环
        // 2.目标值在数组所有元素之前 3.目标值插入数组中 4.目标值在数组所有元素之后 return left 或者 right + 1;
        return left;
    }
}

3.在排序数组中查找元素的第一个和最后一个位置

地址:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

题目:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1

输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]

示例 3:

输入:nums = [], target = 0 输出:[-1,-1]

提示:

0 <= nums.length <= 105 -109 <= nums[i] <= 109 nums 是一个非递减数组 -109 <= target <= 109

答案:

class Solution {
    public int[] searchRange(int[] nums, int target) {
        //rightBorder是不包含target的右边界,leftBorder是不包含target的左边界
        int rightBorder=getRightBorder(nums,target);
        int leftBorder=getLeftBorder(nums,target);
        int res[]=new int[2];
        if(nums.length==0){
            res[0]=-1;
            res[1]=-1;
            return res;
        }
        if(targetnums[nums.length-1]){
            res[0]=-1;
            res[1]=-1;
            return res;
        }else if(rightBorder-leftBorder>1){
            res[0]=leftBorder+1;
            res[1]=rightBorder-1;
            return res;
        }else{
            res[0]=-1;
            res[1]=-1;
            return res;
        }
    }
​
    /**
     *求右边界
     */
    private int getRightBorder(int[] nums,int target){
        int left=0;
        int right=nums.length-1;
        int rightBorder=-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(nums[mid]>target){//当target在左半边的时候
                right=mid-1;
            }else{
                left=mid+1;
                rightBorder=left;
            }
        }
        return rightBorder;
    }
​
    /**
     *求左边界
     */
    private int getLeftBorder(int[] nums,int target){
        int left=0;
        int right=nums.length-1;
        int leftBorder=-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(nums[mid]

解题思路:代码随想录 (programmercarl.com)

4.x的平方根

地址:69. x 的平方根 - 力扣(LeetCode)

题目:

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4 输出:2

示例 2:

输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示

0 <= x <= 231 - 1

答案:

class Solution {
    public int mySqrt(int x) {
        //x的算数平方根的整数部分就是满足k*k<=x的最大k值
        //采用二分查找
        int left=0;
        int right=x;
        //最终答案在两个相邻的整数之前产生,取更小的那个
        //比如8的算术平方根是2.82842...,由于返回类型是整数,小数部分被舍去后为结果2
        //while循环运行到最后会在2和3之间选择,更小的那个是left的值,即最终答案
        //对于一个非负数其取整数的平方根一定在其0到他的一半之间(除了0,1)
        if(x==0)
        return 0;
        if(x==1)
        return 1;
        //此为界定条件,一个巧妙的1使得最后经过若干次循环后,左值右值差不多相等
        while(right>left+1){//因为都是整型,所以差极小时即为差了1。所以当到了差1的条件时就可以跳出循环了。
            int mid=(left+right)/2;
            if(mid>x/mid){//一开始mid*mid肯定比x大,如果写mid*mid>x会越界,超出时间限制
                right=mid;
            }else{
                left=mid;
            }
        }
        return left;
    }
}

解题思路:(4条消息) 力扣求平方根三种方法小白理解向光.的博客-CSDN博客力扣 平方根

5.有效的完全平方数

地址:367. 有效的完全平方数 - 力扣(LeetCode)

题目:

给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。

进阶:不要使用任何内置的库函数,如 sqrt 。

示例 1:

输入:num = 16 输出:true

示例 2:

输入:num = 14 输出:false

提示:

1 <= num <= 2^31 - 1

答案:

class Solution {
    public boolean isPerfectSquare(int num) {
        int left=0;
        int right=num;
        while(right>=left){
            int mid=(left+right)/2;
            //使用mid*mid==num会越界,超出时间限制;使用num/mid==mid会报by zero错误
            //by zero错误:当我们定义的被除数为整型时候(short int long)会抛出此异常,被除数为整型时不可以为零。
            long temp_mid=(long)mid*mid;//转成long型才不会报错
            if(temp_mid==num){
                return true;
            }else if(temp_mid

解题思路:(4条消息) 力扣题:367有效的完全平方数_追梦偏执狂的博客-CSDN博客

你可能感兴趣的:(LeetCode算法刷题,leetcode,算法,java)