zoukankan      html  css  js  c++  java
  • 二分查找

    1. 原始查找一个数

     1 /*
     2 * https://leetcode-cn.com/problems/binary-search/
     3 *
     4 * 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,
     5 * 如果目标值存在返回下标,否则返回 -1。
     6 */
     7 public class code070_binarySearch
     8 {
     9     public int search(int[] nums, int target) {
    10         int start = 0, end = nums.length - 1;
    11         while(start <= end){
    12             int mid = start + (end - start) / 2;
    13             if(nums[mid] == target){
    14                 return mid;
    15             }else if(nums[mid] < target){
    16                 start = mid + 1;
    17             }else if(nums[mid] > target){
    18                 end = mid - 1;
    19             }
    20         }
    21         return -1;
    22     }
    23 }

    2. 寻找左侧和右侧边界

     1 package leetcode_2020;
     2 /*
     3 * https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
     4 *
     5 * 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
     6 *
     7 * 你的算法时间复杂度必须是 O(log n) 级别。
     8 *
     9 * 如果数组中不存在目标值,返回 [-1, -1]
    10 */
    11 public class code034_firstAndLastBybinarySearch
    12 {
    13     public int[] searchRange(int[] nums, int target) {
    14         int rs[] = {-1, -1};
    15         if (nums.length == 0)
    16             return rs;
    17 
    18         //left
    19         int start = 0, end = nums.length - 1;
    20         while (start <= end){
    21             int mid = start + (end - start) / 2;
    22             if (nums[mid] == target)
    23                 end = mid - 1;
    24             else if (nums[mid] < target)
    25                 start = mid + 1;
    26             else if(nums[mid] > target)
    27                 end = mid - 1;
    28         }
    29         if(start >= nums.length || nums[start] != target)
    30             rs[0] = -1;
    31         else
    32             rs[0] = start;
    33 
    34         //right
    35         start = 0; end = nums.length - 1;
    36         while (start <= end){
    37             int mid = start + (end - start) / 2;
    38             if (nums[mid] == target)
    39                 start = mid + 1;
    40             else if (nums[mid] < target)
    41                 start = mid + 1;
    42             else if(nums[mid] > target)
    43                 end = mid - 1;
    44         }
    45         if(end < 0 || nums[end] != target)
    46             rs[1] = -1;
    47         else
    48             rs[1] = end;
    49         return rs;
    50     }
    51 }

    注意:

      统一:

      end = num.length - 1

      while: <=

      mid = start + (end - start) / 2

      mid + 1 / mid - 1

  • 相关阅读:
    str.format格式化用法(通过{}来替代%)
    urlparse模块(专门用来解析URL格式)
    Socket原理与编程基础
    如何查询端口号和网址的ip地址?
    urlretrieve 如何给文件下载设置下载进度?
    判断URL是否支持断点续传?
    断点续传
    HTTP协议详解之User Agent篇
    HTTP协议详解之基本认证篇
    HTTP协议详解之请求篇
  • 原文地址:https://www.cnblogs.com/Z-D-/p/12635987.html
Copyright © 2011-2022 走看看