每日两道力扣,day2

每日两道力扣,day2

每日两道力扣,day2

每日两道力扣,今日是:

162. 寻找峰值 - 力扣(LeetCode)

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

第一题:寻找峰值

162. 寻找峰值 - 力扣(LeetCode)

1.思路:

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

尽管根据测试数据我们并不能看出数组是有序的,但这个题又说 "给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。"

而且 根据昨天的852. 山脉数组的峰顶索引 - 力扣(LeetCode)

我们可以发现山脉数组的峰顶索引其实上是这个题的子集,既然如此那就容易了,同样用二分查找即可解决。

按照二分查找的思路我们可以把arr分为两段,一段是递增的(也就是arrmid < arrmid + 1),一段是递减的(也就是arrmid > arrmid + 1),而这两段的链接点就是我们要找的峰顶(当left与right相遇时),按照这个逻辑,我们总能找到峰值。

2.代码实现:

复制代码
class Solution {
public:
    int findPeakElement(vector<int>& nums) {
      int left = 0, right = nums.size() - 1;

      while(left < right)
      {
        int mid = left + (right - left)/2;
        if(nums[mid] > nums[mid+1])
        right = mid;
        else if(nums[mid] < nums[mid+1])
        left = mid + 1;

      } 
      return left; 
    }
};

3.细节:

所以我们得采用 int mid = left + (right - left)/2; 来防止数据溢出

第二题:寻找旋转排序数组中的最小值

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)


1.思路:

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

思路图如下:

以上是根据测试用例模拟出来的草图,示例一,二如上图。示例三为上图的最左端那段上升的射线。

核心思路:

想象一下你在爬坡。将 mid 与右边界 right 进行比较

(1)如果numsmid > numsright,mid 在左侧的高斜坡,最小值肯定在右边,left = mid + 1。让mid往右走一点

(2)反之numsmid < numsright,mid 在右侧的低斜坡,最小值在 mid 或者是 mid 的左边,right = mid。让mid往左走一点。

(3)循环结束时,left 和 right 相遇,指向的就是最小值

2.代码实现:
复制代码
class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;

        while(left < right) {
            int mid = left + (right - left) / 2;
            
            // 核心思路:将 mid 与右边界 right 进行比较
            if(nums[mid] > nums[right]) {
                // mid 在左侧的高斜坡,最小值肯定在右边
                left = mid + 1;
            } else {
                // mid 在右侧的低斜坡,最小值在 mid 或者是 mid 的左边
                right = mid;
            }
        }
        
        // 循环结束时,left 和 right 相遇,指向的就是最小值
        return nums[left];
    }
};
3.细节:

我们得采用 int mid = left + (right - left)/2; 来防止数据溢出

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

相关推荐
来一碗刘肉面1 小时前
顺序表与链表的比较
数据结构·算法·链表
alphaTao1 小时前
LeetCode 每日一题 2026/7/13-2026/7/19
算法·leetcode
持力行2 小时前
C++与Java变量声明、定义及内存分配的核心区别
java·开发语言·c++
QN1幻化引擎3 小时前
Dalin L — 我造了一门支持中文编程的语言,完整移植到 Rust 了
人工智能·算法·机器学习
Rainy Blue8833 小时前
C转C++速成
c语言·c++·算法
txzrxz3 小时前
二分图详解
数据结构·c++·算法·图论·深度优先搜索·二分图染色
jinyishu_3 小时前
C++ 继承全解:从基础到高级特性
开发语言·c++
gaosushexiangji3 小时前
数字图像相关DIC系统在结构振动模态测量中的应用
算法
是个西兰花3 小时前
Linux:死锁与生产者消费者模型解析
linux·运维·服务器·c++·死锁·生产者消费者模型
KaMeidebaby4 小时前
卡梅德生物技术快报|如何制备单克隆抗体:小众禽类靶点单抗制备实操流程:双载体抗原交叉筛选完整工艺记录
人工智能·python·深度学习·算法·机器学习