Leetcode刷题笔记8

news2024/12/23 19:09:27

162. 寻找峰值

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

对于所有有效的 i 都有 nums[i] != nums[i + 1]

解法一:暴力解法

从第一个位置一直向后走,然后分情况即可
1. 第二个元素就往下降,那么第一个元素就是峰顶

2. 一直遍历,直到找到下一个元素比前一个元素小

3. 一直遍历没发现下一个元素比前一个元素小,这时返回最后一个元素

时间复杂度:O(N)

解法二:优化暴力解法 - 二分查找


               i  i+1
------------*-*-----------

1. arr[i] > arr[i+1] 
那么此时是一个下降趋势,那么在左边区间一定存在一个峰值,一定存在最终结果
右边不一定,接下来在左边寻找

2. arr[i] < arr[i+1]
那么此时是一个上升趋势,那么在右边区间一定存在一个峰值
左边不一定,接下来在右边寻找

此时发现二段性,可以把数组分成两部分

第一种情况:arr[mid] > arr[mid+1] -> right = mid(包含i,i也可能是峰值)

第二种情况:arr[mid] < arr[mid+1] -> left = mid + 1

代码:C++

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 left = mid + 1;
        }
        return left;
    }
};

153. 寻找旋转排序数组中的最小值

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

解法一:暴力查找最小值

[3,4,5,1,2]
从前往后遍历即可

时间复杂度:O(N)
[3,4,5,1,2]


可以分解为两段,一段有上升趋势,峰值过后的那一段也是上升趋势

解法二:二分查找

二段性:
          B
         /
        /
       /
     A
--------------------------------------------------------
                            D
                           /
                          /
                         /
                        C

AB这段区域是严格大于D点这个值的
CD这段区域是严格小于等于D点这个值的

1. AB这段区域: nums[i] > nums[n-1]
2. CD这段区域: nums[i] <= nums[n-1]

如果是第一种情况:nums[mid] > nums[n-1] -> left = mid + 1
当落在AB的时候没有要找的结果,所以要到右边去找

如果是第二种情况:nums[mid] <= nums[n-1] -> right = mid
mid落在CD,去左边区域寻找,但是right不能越过C点

最后会停在c点,c点就是最小值

代码:C++

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        int x = nums[right];
        while(left < right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] > x) left = mid + 1;
            else right =  mid;
        }
        return nums[left];
    }
};

剑指 offer 53 - II:0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。
在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例 1:
输入: [0,1,3]
输出: 2

示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8

限制:
1 <= 数组长度 <= 10000

解法一:哈希表

解法二:直接遍历找结果

解法三:位运算

用^异或运算
比如[0, 1, 2, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
拿正常数组的数和没有缺少的数组通通异或在一起,相同的数会抵消,最后异或的结果就是缺少的数

解法四:高斯求和公式 - 等差数列

算一下没有缺少这批数的和,首项+末项的和/2
然后依次减去数组中的数,最后的数就是缺失的数

上方四组的时间复杂度都是O(N)

更优的解法,解法五:二分查找

[0, 1, 2, | 4, 5, 6]
index:
[0, 1, 2, | 3, 4, 5]

|左边的值一一对应,右边不对应
所以有二段性

要找的结果就是右边区域的最左边的元素的下标

1. 落在左边区间,值和下标对应:nums[mid] = mid -> left = mid + 1
去右边寻找,因为这个区域一定没有结果

2. 落在右边区间:nums[mid] != mid -> right = mid

细节问题:边界情况
如果数组是[0, 1, 2, 3],下标也是一样的
缺失的元素是后面的4,现在根本不存在右边的区间
最终返回的时候要判断一下,当 left==right,所指的值跟下标相等,要返回的是+1

代码:C++

int missingNumber(vector<int>& nums)
{
    // 解法五,二分查找
    int left = 0, right = nums.size() - 1;
    while (left < right)
    {
        int mid = left + (right - left) / 2;
        if (nums[mid] == mid) return left = mid + 1;
        else right = mid;
    }
    // 返回结果,处理细节问题
    return nums[left] == left ? left + 1 : left;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1807467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux -- 正则表达式基础

提示&#xff1a;制作不易&#xff0c;可以点个关注和收藏哦。 前言 虽然我们这一节的标题是正则表达式&#xff0c;但实际这一节实验只是介绍grep&#xff0c;sed&#xff0c;awk这三个命令&#xff0c;而正则表达式作为这三个命令的一种使用方式&#xff08;命令输出中可以包…

【C++】函数模板和类模版

目录 前言 模板参数 类型模板参数 非类型模板参数 模板的特化 函数模板的特化 类模板的特化 全特化 偏特化 模板的分离编译 模板总结 前言 函数模板和类模板是C模板编程中的两个核心概念&#xff0c;它们允许程序员编写泛型代码&#xff0c;这些代码可以在多种数据…

嵌入式单片机中项目在线仿真工具分享

前段时间,无意间发现了一个不错的在线仿真工具(Wokwi),支持多种平台,支持市面上主流的开发板,比如:STM32、ESP32、Arduino、树莓派等。 还支持常见的传感器、显示器件(LCD、LED屏幕)等,还可以播放音乐、联网、逻辑分析仪等,关键还提供了很多实际项目的案例。 这款工…

对称加密系统解析

目录​​​​​​​ 1.概述 2. 对称密码类型 3. 对称加密优缺点 4. 对称加密算法 4.1 DES 4.2 3DES 4.3 AES ​​​​​​4.4 SM1 4.5 SM4 1.概述 对称加密&#xff0c;是指在加密和解密时使用同一秘钥的方式。秘钥的传送和保存的保护非常重要&#xff0c;务必不要让秘…

【React】json-server

1.安装到开发环境 npm install json-server -D2.在根目录下下&#xff0c;新建db.json文件 {"list": [{"rpid": 3,"user": {"uid": "13258165","avatar": "http://toutiao.itheima.net/resources/images/9…

显示子系统,显示子前后端,linuxfb,wayland

显示前端 显示前端通常指的是在图形系统中负责生成图形数据的部分或组件。它负责接收来自应用程序或图形引擎的图形数据&#xff0c;并将其转换成适合显示的格式&#xff0c;以便发送到显示后端进行处理和输出。 显示前端的功能通常包括以下几个方面&#xff1a; 图形数据生…

自定义类型:枚举(enum)+联合体(union)

枚举联合体 一.枚举1.枚举类型的声明2.枚举类型的优点3.枚举类型的使用 二.联合体1.联合体类型的声明2.联合体的特点3.相同成员的结构体和联合体对比4.联合体大小的计算5.联合体的练习&#xff08;判断大小端&#xff09;6.联合体节省空间例题 一.枚举 1.枚举类型的声明 枚举…

《软件定义安全》之四:什么是软件定义安全

第4章 什么是软件定义安全 1.软件定义安全的含义 1.1 软件定义安全的提出 虚拟化、云计算、软件定义架构的出现&#xff0c;对安全体系提出了新的挑战。如果要跟上网络演进的步伐和业务快速创新的速度&#xff0c;安全体系应该朝以下方向演变。 &#x1d7ed; 安全机制软件…

springcloud gateway扩展支持多版本灰度

改造要求 需要在原有的调度策略中通过客户端header中的version进行1个服务多实例下进行二次分组&#xff0c;让指定的version在指定的版本实例下进行轮训调度。 需要改造的点 1.业务服务在发布到naocs中的元数据需要指定版本号 2.网关的调度策略中需要增加版本的区分 3.无…

LeetCode | 1.两数之和

这道题&#xff0c;很容易想到的是暴力解&#xff0c;直接一个双重循环&#xff0c;对于数组中的每一个数&#xff0c;都去遍历其他数字&#xff0c;看能不能找到数字等于target-nums[i]的数字&#xff0c;时间复杂度为 O ( n 2 ) O(n^2) O(n2) 但是通过其他题目&#xff0c;我…

【算法专题--链表】环形链表--高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、什么是环形链表&#xff1f; &#x1f95d; 环形链表的概念详解 &#x1f347; 环形链表的特点 &#x1f34d;环形链表的延申问题 三、高频面试题 ✨环形链表 ✨环形链表II ✨环形链表的环长 四、总结 五、共勉 一、前言 环形链表&#xff0c;可以说是…

VSCode超过390万下载的请求插件

Thunder Client 是一款在 VSCode&#xff08;Visual Studio Code&#xff09;中非常受欢迎的 REST API 客户端插件&#xff0c;由Ranga Vadhineni开发&#xff0c;现在已经有超过390万的下载量。它允许开发者直接在编辑器内发送 HTTP 请求&#xff0c;查看响应。Thunder Client…

力扣hot100:739. 每日温度/54. 螺旋矩阵

文章目录 一、 739. 每日温度二、54. 螺旋矩阵1、模拟螺旋矩阵的路径2、按层模拟 一、 739. 每日温度 LeetCode&#xff1a;739. 每日温度 经典单调栈问题&#xff0c;求下一个更大的数。 使用单调递减栈&#xff0c;一个元素A出栈&#xff0c;当且仅当它第一次出现比它更大…

bitset用法

参考:https://blog.csdn.net/weixin_45697774/article/details/105563993 题目:https://leetcode.cn/problems/maximum-total-reward-using-operations-ii/description/ class Solution { public:int maxTotalReward(vector<int>& rewardValues) {bitset<10000…

46.django - 多语言配置

1.Django 多语言基础知识 多语言站点可以让不同语言的用户更好地使用和理解网站内容&#xff0c;提升用户体验和覆盖范围。为了实现多语言功能&#xff0c;我们将使用Django内置的国际化和本地化支持。我收集了一些知识点整理在这一部分&#xff0c;感兴趣的可以看看。直接跳过…

单臂路由的配置(思科、华为)

#交换设备 不同vlan属于不同广播域&#xff0c;不能互相通信&#xff0c;他们配置的是不同网段的IP地址&#xff0c;针对不同网段的IP地址进行通信&#xff0c;就需要用到路由技术 实现不同vlan之间的通信技术有两种 单臂路由三层交换 单臂路由 一、思科设备的单臂路由配…

【python】OpenCV—Histogram Matching(9.2)

学习来自OpenCV基础&#xff08;17&#xff09;基于OpenCV、scikit-image和Python的直方图匹配 文章目录 直方图匹配介绍scikit-image 中的直方图匹配小试牛刀风格迁移 直方图匹配介绍 直方图匹配&#xff08;Histogram Matching&#xff09;是一种图像处理技术&#xff0c;旨…

Web 自动化测试(基于Pytest极简)

Pytest 初体验 在使用 Python 进行 Web UI 自动化测试时&#xff0c;我们除了使用 unittest 单元测试框架&#xff0c;还可以使用 pytest&#xff0c;本节实验就给大家简单的介绍一下 pytest。 环境配置 本系列实验我们借助 VS Code 工具编写代码&#xff0c;使用的 Python …

[Llama3] ReAct Prompt 测试实验

ReAct 是一种 LLM 提示和结果处理方法&#xff0c;结合了推理、行动计划和知识源整合&#xff0c;使 LLM 超越其语言模型&#xff0c;并在预测中使用来自现实世界的信息。 ReAct 是推理和行动的结合。 介绍 ReAct 的论文表明它比思维链提示更好。与后者不同的是&#xff0c;Re…

【数据结构(邓俊辉)学习笔记】图06——最小支撑树

文章目录 0. 概述1. 支撑树2. 最小支撑树3. 歧义性4. 蛮力算法5. Prim算法5.1 割与极短跨越边5.2 贪心迭代5.3 实例5.4 实现5.5 复杂度 0. 概述 学习下最小支撑树和prim算法。 1. 支撑树 最小的连通图是树。 连通图G的某一无环连通子图T若覆盖G中所有的顶点&#xff0c;则称…