文章目录
- 力扣题目
- 两种解题思路
- 二分查找
- 自己的解题方法--简单易懂
力扣题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104
两种解题思路
二分查找
思路解析:
1.如果查找到正好的target,这种情况就是直接查找到值,不再提了。
2.返回值设置为left,当这个数字不在数组中时,left这个返回值的索引位置正好是不存在的这个数应该在数组中出现的位置。
3.注意使用 mid = left + (right - left) / 2;是避免溢出。
int searchInsert(int* nums, int numsSize, int target)
{int left = 0;int right = numsSize - 1;int mid = 0;while (left <= right){mid = left + (right - left) / 2;/*防止溢出*/if (nums[mid] < target){left = mid + 1;}else if (nums[mid] > target){right = mid - 1;}else{return mid;}}return left;
}
自己的解题方法–简单易懂
int searchInsert(int* nums, int numsSize, int target)
{int i = 0, count = 0, index = 0;int counts = 0;for(i = 0; i < numsSize; i++){if(nums[i] == target)/*判断数组中有无和target一致的数字*/{count++;break;}}if(count != 1)/*数组中没有和target一样的数字*/{for(i = 0; i < numsSize; i++)/*区分应该插入数组中还是数组的最后*/{if(nums[i] > target)/*说明应该插入数组中*/{index = i;break;}else{counts++;}if(counts == numsSize)/*target大于数组中的左右数*/{index = i + 1;/*target插入到数组的最后*/return index;}}}else if(count == 1)/*如果数组中有和target一致的数字,则返回下标*/{index = i;}return index;
}