Search for a Range

题目

Given an array of integers 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].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

分析

给出了一个int类型的升序的数组,查找数组中等于给出的数字的起始坐标和最终坐标。如果找不到和给出的数相等的数,就返回[-1, -1]。

因为数组已经排好序了,因此我们无须对该数组进行排序。

最简单的做法就是按顺序遍历整个数组,知道找到目标数,但是这个算法的时间复杂度为O(n),明显大于题目所要求的O(log n)。

所以我们采用二分查找的算法求解改题目,而二分查找的时间复杂度为O(log n),符合要求。


class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        // 若数组为空,则不存在符合要求的数
        if (nums.size() == 0) {
            return {-1, -1};
        }
        int a = 0, b = nums.size() - 1;
        int index = (b + a) / 2;
        while (b >= a) {
            if (nums[index] == target) {
                int i, j;
                for (i = index; nums[i] == target && i < nums.size(); i++);
                for (j = index; nums[j] == target && j >= 0; j--);
                return {j+1, i-1};
            } else if (nums[index] >target) {
                b = index - 1;
                index = (b + a) / 2;
            } else {
                a = index + 1;
                index = (b + a) / 2;
            }
        }
        return {-1, -1};
    }
};

在找到符合要求的数之后,还要查找该数前面和后面的数,看是否符合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sure, here's the previous implementation of BST: ```python class Node: def __init__(self, key): self.left = None self.right = None self.val = key class BST: def __init__(self): self.root = None def insert(self, key): self.root = self._insert(self.root, key) def _insert(self, node, key): if node is None: return Node(key) else: if key < node.val: node.left = self._insert(node.left, key) else: node.right = self._insert(node.right, key) return node def search(self, key): return self._search(self.root, key) def _search(self, node, key): if node is None or node.val == key: return node elif key < node.val: return self._search(node.left, key) else: return self._search(node.right, key) ``` And here's the implementation of `range_search`: ```python def range_search(bst, r): result = [] _range_search(bst.root, r[0], r[1], result) return result def _range_search(node, min_val, max_val, result): if node is None: return if min_val <= node.val <= max_val: _range_search(node.left, min_val, max_val, result) result.append(node.val) _range_search(node.right, min_val, max_val, result) elif node.val < min_val: _range_search(node.right, min_val, max_val, result) else: _range_search(node.left, min_val, max_val, result) ``` The `range_search` function takes a BST and a range `r` as input. It initializes an empty list `result` which will contain the nodes within the range. `_range_search` is a recursive helper function. It takes a node, a minimum value `min_val`, a maximum value `max_val`, and the `result` list as input. If the node is within the range, it recursively calls itself on the left and right subtrees, adds the node's value to the result list, and then recursively calls itself on the left and right subtrees again. If the node's value is less than the minimum value of the range, it only recursively calls itself on the right subtree. If the node's value is greater than the maximum value of the range, it only recursively calls itself on the left subtree. Finally, the `range_search` function calls `_range_search` on the root node of the BST and returns the result list.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值