每日两道力扣,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; 来防止数据溢出

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

相关推荐
:-)5 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
Jerry9 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发10 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星10 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮10 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home840710 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>11 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC12 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC12 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师12 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法