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

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

相关推荐
WBluuue2 小时前
AtCoder Beginner Contest 451(ABCDEFG)
c++·算法
im_AMBER2 小时前
Leetcode 151 最大正方形 | 买卖股票的最佳时机 III
数据结构·算法·leetcode·动态规划
Fly Wine2 小时前
Leetcode之简单题:在区间范围内统计奇数数目
算法·leetcode·职场和发展
CoderCodingNo2 小时前
【GESP】C++五级练习题 luogu-P1102 A-B 数对
开发语言·c++·算法
cpp_25012 小时前
B3873 [GESP202309 六级] 小杨买饮料
数据结构·c++·算法·动态规划·题解·洛谷
2301_789015622 小时前
C++11新增特性:可变参数模板、lambda表达式、function包装器、bind绑定、defult和delete
c语言·开发语言·c++·算法·c++11·万能引用
Ahtacca2 小时前
基于决策树算法的动物分类实验:Mac环境复现指南
python·算法·决策树·机器学习·ai·分类
x_xbx2 小时前
LeetCode:567. 字符串的排列
算法·leetcode·职场和发展
沛沛rh452 小时前
力扣 42. 接雨水 - 高效双指针解法(Rust实现)详细题解
算法·leetcode·rust