• 《LeetCode力扣练习》代码随想录——数组(二分查找---Java)


    《LeetCode力扣练习》代码随想录——数组(二分查找—Java)



    刷题思路来源于 代码随想录

    704. 二分查找
    • 左闭右闭——[x,y]
      class Solution {
          public int search(int[] nums, int target) {
      
            if(nums.length==0||nums==null){
              
              return -1;
      
            }
      
            int left=0;
            int right=nums.length-1;
      
            while(left<=right){
      
              int middle=left+(right-left)/2;
      
              if(nums[middle]<target){
      
                left=middle+1;
      
              }else if(nums[middle]>target){
      
                right=middle-1;
      
              }else{
      
                return middle;
      
              }
      
            }
      
            return -1;
      
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
    • 左闭右开——[x,y)
      class Solution {
          public int search(int[] nums, int target) {
      
              if(nums.length==0||nums==null){
                  return -1;
              }
      
              int left=0;
              int right=nums.length;
      
              while(left<right){
      
                  int middle=left+(right-left)/2;
      
                  if(nums[middle]>target){
                      right=middle;
                  }else if(nums[middle]<target){
                      left=middle+1;
                  }else{
                      return middle;
                  }
      
              }
      
              return -1;
      
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
    35. 搜索插入位置
    • 左闭右闭——[x,y]
      class Solution {
          public int searchInsert(int[] nums, int target) {
      
            if(nums.length==0||nums==null){
              return -1;
            }
      
            int n=nums.length;
      
            if(target<nums[0]){
              return 0;
            }
      
            if(target>nums[n-1]){
              return n;
            }
      
            int left=0;
            int right=n-1;
      
            while(left<=right){
      
              int middle=left+(right-left)/2;
      
              if(nums[middle]<target){
                left=middle+1;
              }else if(nums[middle]>target){
                right=middle-1;
              }else{
                return middle;
              }
      
            }
      
            // 其实这个也可以
            // return left;
            return right+1;
      
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
    34. 在排序数组中查找元素的第一个和最后一个位置
    • 左闭右闭——[x,y]
      class Solution {
          public int[] searchRange(int[] nums, int target) {
      
              if(nums==null||nums.length==0){
                  return new int[]{-1,-1};
              }
      
              if(target<nums[0]||target>nums[nums.length-1]){
                  return new int[]{-1,-1};
              }
      
              int left=findLeft(nums,target);
              int right=findRight(nums,target);
      
              if(left==-2||right==-2){
                  return new int[]{-1,-1};
              }
      
              return new int[]{left+1,right-1};
      
          }
      
          private int findLeft(int[] nums, int target){
      
              int result=-2;
              int left=0;
              int right=nums.length-1;
      
              while(left<=right){
      
                  int middle=left+(right-left)/2;
      
                  if(nums[middle]>target){
      
                      right=middle-1;
      
                  }else if(nums[middle]<target){
      
                      left=middle+1;
      
                  }else{
                      
                      right=middle-1;
                      result=right;
      
                  }
      
              }
      
              return result;
      
          }
      
          private int findRight(int[] nums, int target){
      
              int result=-2;
              int left=0;
              int right=nums.length-1;
      
              while(left<=right){
      
                  int middle=left+(right-left)/2;
      
                  if(nums[middle]<target){
      
                      left=middle+1;
      
                  }else if(nums[middle]>target){
      
                      right=middle-1;
      
                  }else{
      
                      left=middle+1;
                      result=left;
      
                  }
      
              }
      
              return result;
      
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
    69. x 的平方根
    • 左闭右闭——[x,y]
      class Solution {
          public int mySqrt(int x) {
      
              if(x==0||x==1){
                  return x;
              }
      
              int left =0;
              int right=x/2+1;
      
              while(left<=right){
      
                  int middle=left+(right-left)/2;
                  long result=(long)middle*middle;
      
                  if(result>x){
                      right=middle-1;
                  }else if(result<x){
                      left=middle+1;
                  }else{
                      return middle;
                  }
      
              }
      
              return right;
      
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
    367. 有效的完全平方数
    • 左闭右闭——[x,y]
      class Solution {
          public boolean isPerfectSquare(int num) {
      
              if(num==0||num==1){
                  return true;
              }
      
              int left=1;
              int right=num/2+1;
      
              while(left<=right){
      
                  int middle=left+(right-left)/2;
                  long result=(long)middle*middle;
      
                  if(result<num){
                      left=middle+1;
                  }else if(result>num){
                      right=middle-1;
                  }else{
                      return true;
                  }
      
              }
      
              return false;
      
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29

  • 相关阅读:
    容器与容器编排系统
    【设计模式】建造者模式
    1812_参考spacemacs的文档拆解ivy layer的组成
    【SpringCloud微服务--Eureka服务注册中心】
    新学期 新气象
    内网渗透之 windows 基础
    将仓库下某个模块复制到新仓库并保留提交记录(非子库)
    feign及(httpclient基于https)协议文件上传、下载到文件服务器
    springboot(ssm邮件过滤系统 在线邮箱平台Java(code&LW)
    Python:实现perfect cube完全立方数算法(附完整源码)
  • 原文地址:https://blog.csdn.net/XRT_knives/article/details/134093973