2021-11-12

二分法查找

好处:

二分法查找比较的次数少

查找的速度快

缺点:需要有序

与力扣704题相结合

public class DichotomySearch {

  public static void main(String[] args) {

  int[] arr = new int[] { -1,0,3,5,9,12 };
   System.out.println(search(arr, -1));
  System.out.println(search(arr, 0));

   System.out.println(search(arr, 3));

   System.out.println(search(arr, 5));
    System.out.println(search(arr, 9));

 	System.out.println(search(arr, 12));

 

  }

 

  public static int search(int[] arr, int key) {

    int start = 0;

    int end = arr.length - 1;
    while (start <= end) {

      int middle = (start + end) / 2;

      if (key < arr[middle]) {
       end = middle - 1;
      } else if (key > arr[middle]) {

       start = middle + 1;

      } else {

        return middle;

      }

    }

    return -1;

  }

}

搜索插入位置

使用 借助indexOf和sort实现

public class SearchInsertSolution {

  public static void main(String[] args) {

    int[] nums={1,3,5,6};

    int target=7;

    System.out.println(new SearchInsertSolution().searchInsert(nums, target));

  }

  public int searchInsert(int[] nums, int target) {

   if (nums==null){
      return -1;
   }

    if (nums.length<=0){
      return -1;

    }
   ArrayList<Integer> list = new ArrayList<>();

   for (int i = 0; i < nums.length; i++) {

      list.add(nums[i]);

      if (target==nums[i]){

       return i;

      }

    }

    list.add(target);

    Collections.sort(list); // 进行排序

    return list.indexOf(target);

  }

}

寻找峰值

class Solution {

  public int findPeakElement(int[] nums) {

    int l = 0, r = nums.length - 1;

    while( l < r)

    {
      int mid = ( l + r )/2;

     if(nums[mid] > nums[mid + 1]) r = mid;

      else l = mid + 1;

    }

    return r;

  }

}

搜索二维矩阵

由于每行的第一个元素大于前一行的最后一个元素,且每行元素是升序的,所以每行的第一个元素大于前一行的第一个元素,因此矩阵第一列的元素是升序的。

我们可以对矩阵的第一列的元素二分查找,找到最后一个不大于目标值的元素,然后在该元素所在行中二分查找目标值是否存在。

代码

class Solution {

  public boolean searchMatrix(int[][] matrix, int target) {
    int rowIndex = binarySearchFirstColumn(matrix, target);

    if (rowIndex < 0) {

      return false;

    }

    return binarySearchRow(matrix[rowIndex], target);

  }

 

  public int binarySearchFirstColumn(int[][] matrix, int target) {

    int low = -1, high = matrix.length - 1;

    while (low < high) {

     int mid = (high - low + 1) / 2 + low;

      if (matrix[mid][0] <= target) {

        low = mid;

      } else {

        high = mid - 1;

      }

   }

    return low;

  }

 

  public boolean binarySearchRow(int[] row, int target) {

   int low = 0, high = row.length - 1;

    while (low <= high) {

      int mid = (high - low) / 2 + low;

     if (row[mid] == target) {

        return true;

      } else if (row[mid] > target) {

        high = mid - 1;

      } else {

        low = mid + 1;

      }
   }

    return false;

  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值