每日两道力扣,day1

每日两道力扣,day1

每日两道力扣,今日是:

35. 搜索插入位置 - 力扣(LeetCode)

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

第一题:搜素插入位置

35. 搜索插入位置 - 力扣(LeetCode)


1.思路:

首先,看到这题第一眼我的脑海里浮现的是直接遍历数组查找target,时间复杂度O(n),但题目规定必须使用时间复杂度为O(log n)的算法,所以我们只能另求他路。

因为数组有序,且为查找,所以我们不难想到二分查找。

思路图如下:

由图可知我们将数组大致划分为三段,第一段是小于target,第二段是等于target,第三段是大于target。

第一次,当numsmid == target时,mid所处位置刚好就是理想位置,因此咱们直接返回mid;

第二次,当numsmid < target时,显然mid所处位置偏左,所以咱们得更新left,让left=mid + 1,进而调整mid的位置;

第三次,当numsmid > 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; 来防止数据溢出

第二题:山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

当我写完第一题的时候,这个题我看一眼就给他秒了。从有思路到代码实现总用时不超过三分钟。下面就让我们来感受一下这个题目

1.思路:

首先映入眼帘的是一个先增后减的数组,其次题目要求

我们必须设计并实现时间复杂度为 O(log(n))的解决方案。

最关键的是题目保证arr是一个山脉数组。这里再次强调了arr是一个先增后减的数组

那我问你你会想到什么方法。Looking my eyes,回答我!

请大声说出你的答案------二分查找。

上图是arr数组的描述草图。我们要的答案,是不是就是找

峰顶top。那怎样找top呢?按照二分查找的思路我们可以把arr分为两段,一段是递增的(也就是arrmid - 1 < arrmid),一段是递减的(也就是arrmid > arrmid + 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; 来防止数据溢出

好了,今天的每日两道力扣到这里就算是结束了,看完是不是感觉有所收获呢?如果学有所获的话,麻烦给个三连支持一下呗。感谢观看,您的支持,将是我前进路上的重要动力。

相关推荐
绿算技术7 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
想吃火锅10058 小时前
【leetcode】1.两数之和js版
javascript·算法·leetcode
net3m339 小时前
一阶软件低通滤波器算法
人工智能·算法
水木流年追梦9 小时前
大模型入门-大模型优化方法12-YaRN 长文本外推技术
人工智能·分布式·算法·正则表达式·prompt
J-Tony1110 小时前
【JVM】三色标记法
java·jvm·算法
wengad10 小时前
机器学习实践理论基础|算法、模型和数据集
人工智能·算法·机器学习
嵌入式ZYXC10 小时前
第3篇:《面试题:I2C为什么要加上拉电阻?阻值怎么选?》
stm32·单片机·嵌入式硬件·面试·职场和发展
sbjdhjd10 小时前
面试(5)| 3.5 小时面试复盘第五弹:加班出差 + 客户响应 + 压力面全拆解
经验分享·程序人生·面试·职场和发展·开源·跳槽·求职招聘
梦梦代码精11 小时前
为什么这个开源的AI平台会火?有点东西。。。
人工智能·算法·机器学习·docker·开源