😄😊😆😃😄😊😆😃
开始cpp刷题之旅,多学多练,尽力而为。
先易后难,先刷简单的。
35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
解法:暴力法(O(n))
因为数组是有序数组,所以使用暴力法是很简单的。
class Solution {
public:int searchInsert(vector<int>& nums, int target) { int res=0; for(int i=0;i<nums.size();i++){if(target<= nums[i]){return i;}}return nums.size();}
};
提交记录如下所示:
暴力法都能击败这么多用户,估计不少老哥是使用暴力法之类的提交的。
😆😆😆😆
思路简单,代码简单,但是不符合题目O(log n) 的需求。
解法:二分查找法O(log n)
二分查找也很好理解,代码如下
class Solution {
public:int searchInsert(vector<int>& nums, int target) { int left = 0;int right = nums.size() - 1;if (target <= nums[0]) {return 0;}if (target > nums[nums.size()-1]) {return nums.size();}int res=0;int middle = 0;while (right >left) {int length = right - left;middle = length % 2 == 0 ? length / 2 : (length + 1) / 2;middle += left;if (right - left <= 1) {res = right;break; }else if (target > nums[middle]) {left = middle;}else if(target <= nums[middle]){right = middle;}}return res;}
};
提交记录如下所示:
思路:设置左右两个指针,将target值与中间值作比较,小于中间值说明靠近左边,就把右指针指向中间位置。否则就靠近右边,把左指针指向中间值。这样每次可以缩小一半的查找范围。
在数据量大的时候,会比循环查找快很多。