zoukankan      html  css  js  c++  java
  • 2021.4.3 在排序数组中查找元素的第一个和最后一个位置

    给定一个按照升序排列的整数数组 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]



    思路分析:
    使用二分查找找到第一次出现目标值的位置,然后利用指针后移

    
    
    public int[] searchRange(int[] nums, int target) {
    ArrayList<Integer> temp = new ArrayList<>();
    boolean sign = false;
    for (int i = 0; i < nums.length; i++) {
    if (nums[i] == target) {
    sign = true;
    break;
    }
    }

    if (sign == false) {
    int result1[] = {-1, -1};
    return result1;
    }
    //第一个
    int location = binarySearch(nums, target);
    int pre = location;
    int rear = 0;
    while (nums[location] == target) {
    rear = location;
    location++;
    if (location == nums.length) {
    break;
    }
    }
    temp.add(pre);
    temp.add(rear);
    if (temp.size() == 1) {
    int result2[] = {temp.get(0), temp.get(0)};
    return result2;
    }
    int result2[] = new int[temp.size()];
    for (int i = 0; i < temp.size(); i++) {
    result2[i] = temp.get(i);
    }
    return result2;
    }

    // 二分查找
    public int binarySearch(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1;
    int location = 0;
    while (left <= right) {
    int mid = (left + right) / 2;
    if (nums[mid] >= target) {
    right = mid - 1;
    } else {
    left = mid + 1;
    }
    }
    return left;
    }
  • 相关阅读:
    QPS 与 TPS 简介
    程序员需要学多门语言吗
    Docker 常用命令
    Dockerfile
    Docker-安装与部署
    Docker 容器相关技术
    java多线程 线程八锁
    java多线程 生产者消费者案例-虚假唤醒
    ConcurrentHashMap
    原子变量与CAS算法
  • 原文地址:https://www.cnblogs.com/spx88/p/14655479.html
Copyright © 2011-2022 走看看