Leetcode 35. Search Insert Position--在有序数组中,查找目标值的插入位置。如果tar存在,则返回tar的下标;如果tar不存在,则返回插入tar的正确的下标

这是一个关于在有序数组中查找目标值插入位置的问题。如果目标值存在,返回其下标;若不存在,返回正确的插入下标。题目要求实现一个具有线性时间复杂度的算法。给定的例子展示了不同情况下的操作。
摘要由CSDN通过智能技术生成

Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You must write an algorithm with O(log n) runtime complexity.

Example 1:

Input: nums = [1,3,5,6], target = 5
Output: 2

Example 2:

Input: nums = [1,3,5,6], target = 2
Output: 1

Example 3:

Input: nums = [1,3,5,6], target = 7
Output: 4

Constraints:

  • 1 <= nums.length <= 104
### 回答1: 题目描述:给定一个升序整型数组和一个目标值,搜索数组是否存在目标值,若存在返回下标,否则返回-1。 解题思路:由于数组是有序的,可以使用二分查找的方法进行搜索。首先确定数组的左右边界,然后计算位置下标,比较位置的值和目标值的大小,如果相等则返回下标,如果位置的值大于目标值,则在左半部分继续查找,否则在右半部分继续查找,直到找到目标值或者左右边界相遇。 代码实现: class Solution { public: int search(vector<int>& nums, int target) { int left = , right = nums.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] > target) { right = mid - 1; } else { left = mid + 1; } } return -1; } }; ### 回答2: 二分查找(Binary Search)是一种优秀的查找算法,其时间复杂度为O(logn)。在查找有序数组时,二分查找是一种非常高效的方法。 通过不断地将区间缩小为一半来进行查找,二分查找是一种分治思想的应用。具体来说,对于给定的有序数组nums,在区间[0, n-1]查找某一元素target。每次找到区间的间值mid,将mid与target进行比较,如果mid等于target,返回mid的下标。否则,如果mid大于target,在左侧区间[0, mid-1]继续查找;如果mid小于target,在右侧区间[mid+1, n-1]继续查找。如此迭代直至找到target或者区间被缩小为空。 以下是二分查找的简单实现,其left和right表示当前查找区间的左右边界。 ``` int binarySearch(vector<int>& nums, int target) { int n = nums.size(); int left = 0, right = n - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) return mid; else if (nums[mid] > target) right = mid - 1; else left = mid + 1; } return -1; } ``` 需要注意的是,该算法要求目标数组必须有序,否则不能保证正确性。另外,在实现时需要注意整型溢出问题,可以使用left + (right - left) / 2来防止溢出。 ### 回答3: 题目描述: 给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索numstarget,如果目标值存在返回下标,否则返回-1。 解题思路: 由于数组有序,可以考虑使用二分查找的方法。二分查找的基本思想是将有序数组一分为二,确认目标值在哪个子数组,然后继续对子数组进行二分查找。具体实现则是定义一个左指针和一个右指针,不断将数组分成两个子数组,然后判断目标值在哪个子数组,直到左右指针相遇时结束。 代码实现: class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; } }; 时间复杂度分析: 二分查找的时间复杂度为O(log n),其n为数组长度。因为每次都将数组分成两个子数组,所以可以得到一个递归式:T(n) = T(n/2) + O(1),根据主定理可以得到其时间复杂度为O(log n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十六画生的博客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值