2016 - 2024

感恩一路有你

在已排序数组中查找元素的第一个和最后一个位置

浏览量:2219 时间:2024-01-15 15:10:31 作者:采采

给定一个按照升序排列的整数数组`nums`,和一个目标值`target`。要求找出给定目标值在数组中的开始位置和结束位置。时间复杂度为O(logn)。

解决方案

我们可以使用二分查找来解决这个问题。首先,我们需要编写一个函数,通过二分查找获取一个指定值在有序数组中第一次出现的位置。如果没有找到该元素,则返回-1。其伪代码如下:

```

function findFirstOccurrence(nums, target):

left 0

right nums.length - 1

while left < right:

mid (left right) / 2

if nums[mid] target and (mid 0 or nums[mid-1] ! target):

return mid

elif nums[mid] < target:

left mid 1

else:

right mid - 1

return -1

```

接下来,我们再编写一个函数,通过二分查找获取一个指定值在有序数组中最后出现的位置。如果没有找到该元素,则返回-1。其伪代码如下:

```

function findLastOccurrence(nums, target):

left 0

right nums.length - 1

while left < right:

mid (left right) / 2

if nums[mid] target and (mid nums.length-1 or nums[mid 1] ! target):

return mid

elif nums[mid] > target:

right mid - 1

else:

left mid 1

return -1

```

接下来,我们将上述两个二分查找方法结合起来,编写一个函数来获取一个元素在排序数组中第一次和最后一次出现的位置。其伪代码如下:

```

function searchRange(nums, target):

first findFirstOccurrence(nums, target)

last findLastOccurrence(nums, target)

return [first, last]

```

测试方法

为了验证我们的解决方案是否正确,我们需要编写一些测试方法。以下是一个简单的测试方法:

```

function test():

nums [1, 2, 2, 3, 4, 5, 5, 5, 6]

target 5

result searchRange(nums, target)

if result [5, 7]:

print("Test Passed")

else:

print("Test Failed")

test()

```

运行测试方法

运行上述测试方法,并观察控制台输出。如果输出符合预期,则本地测试通过。

提交算法

在完成本地测试之后,可以将算法提交到相应的平台进行测试。如果经过平台测试也通过了,那么我们的解决方案就是正确的。

通过以上步骤,我们可以在已排序数组中高效地查找元素的第一个和最后一个位置。这种方法的时间复杂度为O(logn),相比于线性查找的O(n)要更加高效。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。