文章目录
前言
此文为LeetCode练习
一、【搜索插入位置】
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
二、题解
0.Key0
代码如下(示例):
int searchInsert(int* nums, int numsSize, int target){
int high = numsSize - 1, low = 0, mid;
while(low <= high){
mid = (low + high) / 2; //取中间位置
if(nums[mid] == target)
return mid;
else if(nums[mid] > target) //将从前半部分查找
high = mid -1;
else //将从后半部分查找
low = mid + 1;
}
if(nums[mid]<target)
return mid + 1;
else if (nums[mid]>target)
return mid ;
return -1;
}
思路
此题涉及二分查找(又称折半查找),且是有序顺序表。
- 将初始顺序表(这里用list1表示)一分为二,用顺序表中间位置元素值与给定的target值比较,若target值大于中间位置元素值,则舍弃前半部分顺序表,仅留后半部分顺序表。
- 将后半部分的顺序表看作一个新的顺序表(这里用list2表示),在list2中,取中间位置元素,将其与target比较大小,重复步骤1的动作。
- 在target与表中间位置元素比较时,若相等,则直接返回中间位置元素索引。若不等,则重复步骤1与步骤2的动作。最后low、high和mid会指向同一个位置,此时将该位置元素与target值比较,若该位置元素(mid所指元素)大于target,则target将在此插入,mid所指元素及之后的元素全部后移一位。
举例:
若target为9,而被low、high、mid同时指向的元素值为10,因为是顺序表,9要排在10之前,所以10和10后面的元素都要后移,让出一个位置来给9。
若target为11,而被low、high、mid同时指向的元素值为10,因为是顺序表,11排在10之后,那么原先排在10后面的元素就要后移让出一个位置给11。
这种插入问题可想象成现实中的插队。
同时,建议解题时可在草稿上推演一下。