• 《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

  • 相关阅读:
    Allegro 17.4 SMD 敷铜,Shape 敷铜属性更改, Gerber 生成
    2022人工智能顶会时间序列论文汇总
    为什么说Crypto游戏正在改变游戏产业?
    HTML学习笔记Day2-头条页面案例
    组里来了一个实习生,一行代码引发了一个惨案
    学习笔记-ThinkPHP5之任意方法调用RCE(六)
    有关 ThreadLocal 的一切
    微信小程序开发之map地理定位的使用
    C++强类型枚举
    【毕业设计】1-1Matlab小电流接地系统的建模与单相故障的仿真分析(仿真工程文件+结果图+论文+PPT)
  • 原文地址:https://blog.csdn.net/XRT_knives/article/details/134093973