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

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

相关推荐
鹿角片ljp6 分钟前
LeetCode 300. 最长递增子序列|从 DP O (n²) 到贪心 + 二分 O (n log n)
算法·动态规划
叠层归一研究院8 分钟前
缝合维度:时空3+1结构的拓扑起源
人工智能·算法·机器学习·agi
YXXY31318 分钟前
FloodFill算法
算法
OPEN-F27 分钟前
C++入门教程:数组、字符串与指针入门
数据结构·c++·算法
林森lsjs39 分钟前
零基础吃透二叉树:定义、遍历与高频算法 —数据结构柒
java·开发语言·数据结构·算法·二叉树
船厂电气自动化ai大模型42 分钟前
AI大模型与数学·第56课 快速傅里叶变换FFT:DFT高效优化算法,图像、音频、扩散模型工程加速核心工具
数据结构·人工智能·深度学习·算法·机器学习
203号居民43 分钟前
【无标题】LeetCode hot 100 —54. 螺旋矩阵
算法
烤羊腿的程序员1 小时前
前端面试知识点大全(带答案)
前端·面试·职场和发展
ai产品老杨1 小时前
越界检测算法接入 AI 视频分析平台的流程与误报优化指南
人工智能·算法·音视频
bluesky9612221 小时前
malloc 和 realloc C/C++
c语言·c++·算法