题目链接:https://leetcode-cn.com/leetbook/read/array-and-string/cxqdh/
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5
输出: 2
示例 2:输入: [1,3,5,6], 2
输出: 1
示例 3:输入: [1,3,5,6], 7
输出: 4
示例 4:输入: [1,3,5,6], 0
输出: 0
思路:
题目里描述,这是一个排序数组(可看出来,是升序),题目处有标签,标明了“二分查找”,又无重复元素,可以看出这是一个很标准的二分查找题目。
(之后若看到“有序数组”,便可思考是否可用“二分法”来解决)
目标元素的插入位置有4个:a[0]、a[n]、a[i](其中 a[i] 可以分 2 种情况,一种是目标元素 = 数组内元素,另一种是不相等则插入数组中)
二分法,要取中间值进行比较,中间值 = ( 左值 + 右值 )/ 2 , 而 “int middle = left + ((right - left) >> 1); ” 等价于 “ int middle = ( left + right ) / 2; ” ,经查询,前者可防溢出,也会让运算更快。
class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0;int n = nums.size();int right = n - 1;while (left <= right){int middle = left + ((right - left) >> 1);if (target > nums[middle]){left = middle + 1;}else if (target < nums[middle]){right = middle - 1;}else {return middle;}}return right + 1;}
};
这题推荐大家去学习这一篇内容,很详细地介绍了二分查找(有暴力解法),已经不用楼主多说什么了,网址如下:
- 数组:每次遇到二分法,都是一看就会,一写就废 https://mp.weixin.qq.com/s/fCf5QbPDtE6SSlZ1yh_q8Q
如果大家想对“二分法”进一步了解学习,可以看下面这一篇,网址如下:
- 二分查找、二分边界查找算法的模板代码总结 https://segmentfault.com/a/1190000016825704