• Java程序设计:在排序数组中查找元素的第一个和最后一个位置(LeetCode:34)


    题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

    如果数组中不存在目标值 target,返回 [-1, -1]

    示例 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]

    class Solution {
    public int[] searchRange(int[] nums, int target) {
    //nums为升序排列的数组,target为目标值
    int[] res = new int[]{-1,-1};
    int startIndex;
    int endIndex;
    boolean flag = false;
    LinkedHashMap<Integer,Integer> map = new LinkedHashMap<Integer,Integer>();
    for(int i=0;i<nums.length;i++){
    if(target == nums[i]) {
    map.put(i,nums[i]);
    flag = true;
    }
    }
    if(!flag){
    return res;
    }
    Map.Entry<Integer, Integer> k1 = getHead(map);
    Map.Entry<Integer, Integer> k2 = getTail(map);
    res[0] = k1.getKey();//第一个下标
    res[1] = k2.getKey();//最后一个下标
    return res;
    }
    //取有序链表的第一个键值对
    public Map.Entry<Integer, Integer> getHead(LinkedHashMap<Integer,Integer> map) {
    Map.Entry<Integer, Integer> entry = map.entrySet().iterator().next();
    return entry;
    }


    //取有序链表的最后一个键值对
    public Map.Entry<Integer, Integer> getTail(LinkedHashMap<Integer,Integer> map) {
    Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
    Map.Entry<Integer, Integer> tail = null;
    while (iterator.hasNext()) {
    tail = iterator.next();
    }
    return tail;
    }
    }

    测试用例一:

    测试用例二:

     

    二分法查找思想:用二分查找思想找到target,然后在往前后找出所有的target,从而确认范围

    class Solution {
    public int binarySearch(int[] nums, int target) {
    if (nums == null || nums.length == 0) {
    return -1;
    }
    int l = 0;
    int r = nums.length - 1;
    while (l <= r) {
    int middle = (l + r) / 2;
    if (nums[middle] == target) {
    return middle;
    } else if (nums[middle] > target) {
    r = middle - 1;
    } else {
    l = middle + 1;
    }
    }
    return -1;
    }

    public int[] searchRange(int[] nums, int target) {
    int[] arr = { -1, -1 };
    if (nums == null || nums.length == 0) {
    return arr;
    }
    int index = binarySearch(nums, target);
    if (index == -1) {
    return arr;
    }
    int l = index - 1;
    while (l >= 0 && nums[l] == target) {
    --l;
    }
    arr[0] = l + 1;
    int r = index + 1;
    while (r < nums.length && nums[r] == target) {
    ++r;
    }
    arr[1] = r - 1;

    return arr;
    }
    }
  • 相关阅读:
    socket学习笔记——获取域名与IP(linux)
    socket学习笔记——实现收发文件(Windows)
    socket学习笔记——IO口的基本操作(读、写)
    Microsoft Visual C++ 2010(86) Redistributable不能安装完美解决
    AD转换精度的计算
    cuda编程基础
    CUDA中并行规约(Parallel Reduction)的优化
    Warp divergence
    提取图片中文字
    GPU基本概念详解
  • 原文地址:https://www.cnblogs.com/Yi-ling/p/14068811.html
Copyright © 2020-2023  润新知