zoukankan      html  css  js  c++  java
  • 34- Find First and Last Position of Element in Sorted Array

    Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

    Your algorithm's runtime complexity must be in the order of O(log n).

    If the target is not found in the array, return [-1, -1].

    Example 1:

    Input: nums = [5,7,7,8,8,10], target = 8
    Output: [3,4]

    Example 2:

    Input: nums = [5,7,7,8,8,10], target = 6
    Output: [-1,-1]

    我的解:

    Runtime: 12 ms, faster than 32.21% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
    Memory Usage: 10.2 MB, less than 98.90% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
    class Solution {
    public:
        // 递归进行,二分查找
        void binSearch(vector<int>& nums, int target, int begin, int end, int& index1, int& index2)
        {
            while (begin <= end)
            {
                int mid = begin + (end - begin) / 2;
                if (nums[mid] == target)
                {
                    if (mid < index1)index1 = mid;
                    if (mid > index2)index2 = mid;
                    if (begin == end) return ;
                    if (mid > 0 && nums[mid - 1] == target) binSearch(nums, target, begin, mid - 1, index1, index2);
                    if (mid < end && nums[mid + 1] == target) binSearch(nums, target, mid + 1, end, index1, index2);
                    return;
                }
                if (nums[mid] < target)
                {
                    begin = mid + 1;
                }
                if (nums[mid] > target)
                {
                    end = mid - 1;
                }
            }
        }
        vector<int> searchRange(vector<int>& nums, int target) {
            vector<int> res{ -1,-1 };
            if (nums.size() < 1)return res;
            int b = 0;
            int e = nums.size() - 1;
            int index1 = e + 1;
            int index2 = b - 1;
            binSearch(nums, target, b, e, index1, index2);
            if (index1 <= index2)
            {
                res[0] = index1;
                res[1] = index2;
            }
            return res;
        }
    };

    优秀解1:

    Runtime: 8 ms, faster than 85.03% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
    Memory Usage: 10.1 MB, less than 100.00% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
    class Solution {
    public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int idx1 = lower_bound(nums, target);
        int idx2 = lower_bound(nums, target+1)-1;
        if (idx1 < nums.size() && nums[idx1] == target)
            return {idx1, idx2};
        else
            return {-1, -1};
    }
    
    // 利用二分查找的思想
    int lower_bound(vector<int>& nums, int target) { int l = 0, r = nums.size()-1; while (l <= r) { int mid = (r-l)/2+l; if (nums[mid] < target) l = mid+1; else r = mid-1; } return l; } };
     
  • 相关阅读:
    接着上回,导包正确之后,出现javabean.Friend cannot be cast to java.util.List,的错误。找了很久。以为是User user0作为参数,改成了String username还是错误,看了看listFriend.jsp没有错误,我想会不会是包多了,导致类型复杂。最后发现包少了一个:
    c语言
    软链接和硬链接的联系和区别
    centos7怎么永久修改hosname
    虚拟机静态ip设置
    Centos、Ubuntu开启命令模式
    Kubernetes重要概念理解
    人生道路上,永远没有“容易”二字
    知识【英文】
    模板【kruskal重构树】
  • 原文地址:https://www.cnblogs.com/qiang-wei/p/11801396.html
Copyright © 2011-2022 走看看