每日两道力扣,day1

每日两道力扣,day1

每日两道力扣,今日是:

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

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

第一题:搜素插入位置

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


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; 来防止数据溢出

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

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

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

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; 来防止数据溢出

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

相关推荐
良木生香5 分钟前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
XWalnut24 分钟前
LeetCode刷题 day16
数据结构·算法·leetcode·链表·动态规划
foundbug9992 小时前
基于混合整数规划的电池容量优化 - MATLAB实现
数据结构·算法·matlab
chutao2 小时前
EasyPDF 转图片(EasyPdf2Image)—— 本地安全实用的PDF与图片双向互转工具
安全·职场和发展·pdf·创业创新·学习方法
海绵宝宝的月光宝盒3 小时前
2-非金属材料
经验分享·笔记·学习·其他·职场和发展·课程设计·制造
memcpy03 小时前
LeetCode 2452. 距离字典两次编辑以内的单词【暴力;字典树】中等
算法·leetcode·职场和发展
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:魔法
c++·算法·贪心·csp·信奥赛·排序贪心·魔法
wearegogog1234 小时前
基于和差波束法的单脉冲测角MATLAB实现
人工智能·算法·matlab
AI科技星4 小时前
灵魂商数(SQ) · 全域数学统一定义【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
晓觉儿4 小时前
【GPLT】2026年第十一届团队程序设计天梯赛赛后题解(已写2h,存档中)
数据结构·c++·算法·深度优先·图论