每日两道力扣,day1

每日两道力扣,今日是:
第一题:搜素插入位置


1.思路:
首先,看到这题第一眼我的脑海里浮现的是直接遍历数组查找target,时间复杂度O(n),但题目规定必须使用时间复杂度为O(log n)的算法,所以我们只能另求他路。
因为数组有序,且为查找,所以我们不难想到二分查找。
思路图如下:

由图可知我们将数组大致划分为三段,第一段是小于target,第二段是等于target,第三段是大于target。
第一次,当nums[mid] == target时,mid所处位置刚好就是理想位置,因此咱们直接返回mid;
第二次,当nums[mid] < target时,显然mid所处位置偏左,所以咱们得更新left,让left=mid + 1,进而调整mid的位置;
第三次,当nums[mid] > target时,同理mid所处位置偏右,所以咱们得更新right,让right = mid - 1,进而调整mid的位置
当while循环结束后,left 与 right相遇,咱们直接返回left 或 right所在位置即可.
2.代码实现:
代码如下:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0, right = nums.size()-1;
while(left <= right)
{
int mid = left + (right - left)/2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
{
left = mid + 1;
}
else if(nums[mid] > target)
{
right = mid - 1;
}
}
return left;
}
};
3.细节:
注意该题数据要求:

所以我们得采用 int mid = left + (right - left)/2; 来防止数据溢出
第二题:山脉数组的峰顶索引


当我写完第一题的时候,这个题我看一眼就给他秒了。从有思路到代码实现总用时不超过三分钟。下面就让我们来感受一下这个题目
1.思路:
首先映入眼帘的是一个先增后减的数组,其次题目要求
我们必须设计并实现时间复杂度为 O(log(n))的解决方案。
最关键的是题目保证arr是一个山脉数组。这里再次强调了arr是一个先增后减的数组
那我问你你会想到什么方法。Looking my eyes,回答我!
请大声说出你的答案------二分查找。

上图是arr数组的描述草图。我们要的答案,是不是就是找
峰顶top。那怎样找top呢?按照二分查找的思路我们可以把arr分为两段,一段是递增的(也就是arr[mid - 1] < arr[mid]),一段是递减的(也就是arr[mid] > arr[mid + 1]),而这两段的链接点就是我们要找的峰顶(当left与right相遇时)
2.代码实现:
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int left = 0, right = arr.size() - 1;
while(left < right)
{
int mid = left + (right - left)/2;
if(arr[mid] < arr[mid+1])
{
left = mid + 1;
}
else if(arr[mid] > arr[mid+1])
{
right = mid;
}
}
return right;
}
};
3.细节:
注意题目要求:

所以我们得采用 int mid = left + (right - left)/2; 来防止数据溢出
好了,今天的每日两道力扣到这里就算是结束了,看完是不是感觉有所收获呢?如果学有所获的话,麻烦给个三连支持一下呗。感谢观看,您的支持,将是我前进路上的重要动力。