leetcode(81-85)

Leetcode 81:搜索旋转排序数组II(最详细的解法!!!) 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 示例 1: 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 示例 2: 输入: nums = [2,5,... 阅读详情

81. 搜索旋转排序数组 II

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。

编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

示例 1:

输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true

示例 2:

输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false

进阶:

  • 这是 搜索旋转排序数组 的延伸题目,本题中的 nums  可能包含重复元素。
  • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int begin = 0;
        int end = nums.size() -1;
        int i=0;
        
        while(begin <= end){
            for(i=begin; i<end && nums[i]==nums[i+1];i++);
            begin=i;
            for(i=end; i>begin && nums[i]==nums[i-1];i--);
            end=i;
            int mid = (begin+ end)/2;
            if(target == nums[mid])
                return true;
            else if(target < nums[mid]){
                if(nums[begin] < nums[mid]){
                    if(target >= nums[begin]){
                        end = mid -1;
                    }else{
                        begin = mid + 1;
                    }
                }else if(nums[begin] > nums[mid]){
                    end = mid -1;
                }else if(nums[begin] == nums[mid]){
                    begin = mid + 1;
                }
            }else if(target > nums[mid]){
                if(nums[begin] < nums[mid]){
                    begin = mid + 1;
                }else if(nums[begin] > nums[mid]){
                    if(target >=nums[begin]){
                       end = mid -1; 
                    }else{
                        begin = mid +1;
                    }
                }else if(nums[begin] == nums[mid])
                    begin = mid + 1;
            }
        }
        return false;        
    }
};

82. 删除排序链表中的重复元素 II

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head == NULL) return head;
        double tmp=1.2;
        ListNode* dummy = new ListNode(0);
        ListNode* s=dummy;
        while(head!=NULL && head->next!=NULL){
            if(head->val == head->next->val) tmp=head->val;
            if(head->val!=tmp){
                ListNode* tp = new ListNode(head->val);
                s->next=tp;
                s=s->next;
            }
            head=head->next;
        }
        if(head->val != tmp){
            ListNode* tp = new ListNode(head->val);
            s->next=tp;
            s=s->next;
        }
        return dummy->next;
    }
};

83. 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2

示例 2:

输入: 1->1->2->3->3
输出: 1->2->3
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head == NULL) return head;
        ListNode* resHead = head;
        while(head->next != NULL){
            if(head->val == head->next->val) {
                head->next = head->next->next;
            } else head=head->next;
        }
        return resHead;
    }
};

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

 

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

 

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

 

示例:

输入: [2,1,5,6,2,3]
输出: 10
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        heights.push_back(-1);
        int max_size=0;
        int index=0;
        stack<int> s;
 
        while(index<heights.size()){
            if(s.size()==0||heights[s.top()]<=heights[index]){
                s.push(index);
                index++;
            } else {
                int top=s.top();
                s.pop();
                int size=0; 
                if(s.size()==0) {
                    size=heights[top]*index;
                } else {
                    size=heights[top]*(index-s.top()-1);
                } 
                if(size>max_size) max_size=size;
            }
        } 
        return max_size;
    }
};

85. 最大矩形

给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例:

输入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
输出: 6
class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix) {  
        if(matrix.size()==0) return 0;     
        int* hist = new int[matrix[0].size()];  
        memset(hist, 0, sizeof(int)*matrix[0].size());    
        int max_ = 0;    
        for(int i=0; i<matrix.size(); i++){  
            for(int j=0; j<matrix[0].size(); j++){  
                if(matrix[i][j]=='1')  *(hist+j) += 1;  
                else  *(hist+j) = 0;  
            }    
            max_ = max(max_, maxRectInHistogram(hist, matrix[0].size()) );  
        }     
        return max_;  
    }   
    int maxRectInHistogram(int hist[], int n){      
        int max_ = hist[0]; 
        int j = 0, k = 0, temp =0;
        for(int i=0; i<n; i++){    
                j = i, k = i;
                while(j < n&&hist[j] >= hist[i])j++;
                while(k >= 0&&hist[k] >=hist[i])k--;
                temp = (j-k-2 + 1)*hist[i];
                max_ = max(temp,max_);
        }      
        return max_;    
    }    
};

(以上题目均摘自leetcode)

LeetCode 第81题:搜索旋转排序数组 II 通过上述详细的解析和多种解法的对比,相信大家对LeetCode第81题的解法有了深入的理解。本文介绍了线性搜索法、二分查找法和改进的二分查找法,每一种方法都有其优缺点。线性搜索法虽然简单直接,但效率较低;二分查找法利用了数组的有序特性,提高了搜索效率;改进的二分查找法在处理数组中存在重复元素的情况下更加鲁棒。希望大家能够根据具体情况选择合适的解法,并灵活应用到其他类似的搜索问题中。最后,希望大家在刷题的过程中,不断总结,不断进步。祝大家都能在算法的道路上走得更远! 阅读详情

相关推荐

LeetCode+ 81 - 85 数组、二分查找|链表、双指针|链表|单调栈|单调栈

算法标签:数组、二分查找 参考第 33 题LeetCode+ 31 - 35 二分专题_小雪菜本菜的博客-优快云博客(线性扫描) O(n)参考题解LeetCode 81 Search in Rotated Sorted Array II - AcWing这道题类似于第 33 题,不同点在于这道题里的数组可能包含相同元素。 目前能想到的二分做法的最坏时间复杂度都是 O(n),所以索性就拿线性扫描做了^^时间复杂度分析:整个数组只扫描一遍,所以时间复杂度是 O(n) 与第 33 题的区别是里面可能有重复元

weixin_60569662的博客 362

Leetcode刷题---81

题目: 一个原本增序的数组被首尾相连后按某个位置断开(如 [1,2,2,3,4,5] → [2,3,4,5,1,2],在第一位和第二位断开),我们称其为旋转数组。给定一个值,判断这个值是否存在于这个为旋转数组中。 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 方法一: 二分查找 class Solution { public: bool search(vector<int>& nums, int target) {

m0_50394077的博客 510

告别迷茫!手把手教你用ArcGIS+GTB搞定生态源地MSPA分析(附避坑指南)

本文详细介绍了如何使用ArcGIS和GTB进行生态源地MSPA分析的全流程,包括软件安装、数据预处理、参数设置、结果可视化和常见问题排查。特别针对ArcGIS和GTB组合使用时的常见问题提供了避坑指南,帮助研究者高效完成生态规划任务。

weixin_30756499的博客 435

LeetCode 题目 81:搜索旋转排序数组 II

多种算法详解 LeetCode 题目 81:搜索旋转排序数组 II

10年数据\经营分析经验,现任大厂数据分析负责人 832

手把手教你用STM32F030实现功率MOS双脉冲测试(附完整电路图)

本文详细介绍了如何使用STM32F030微控制器搭建功率MOSFET双脉冲测试平台。通过分析双脉冲测试原理,提供了完整的硬件电路设计、驱动电路选型、软件时序生成方法,并指导如何利用示波器捕获和分析开关波形,从而评估功率器件的动态特性与开关损耗。

juice的博客 713

欧姆龙NX控制器与Sysmac studio的电机配置方法

使用歐姆龍NX控制器與Sysmac studio控制電機簡單運動 <上> — 環境配置0. 前言1. 實際硬件連接2. Sysmac studio 配置2.1 新建工程2.2 通信設置2.2.1 軟件內通信設置2.2.2 上位機本地通信設置 0. 前言 筆者最近需要使用到歐姆龍的多軸運動控制器來控制電機運動,但網路上關於Sysmac studio的教程或文章較為零散,作為初學者的筆者難以消化,故在稍微會用軟件後撰寫本文,為自己留個筆記,同時希望能夠幫助到需要的人。 1.本文面向買了歐姆龍控制器

weixin_46005653的博客 1万+

Leetcode(81)——搜索旋转排序数组 II

Leetcode(81)——搜索旋转排序数组 II

KCDCY的博客 414

windows sever2019切换Linux内核

安装docker engine后,内核是windows,很多镜像都无法安装使用。 一,在https://github.com/linuxkit/lcow/release 下载最新版本release.zip,我使用了如下版本。 二,新建文件夹C:\Program Files\Linux Containers ,把release.zip(不要解压)放入此文件夹 三,编辑docker配置文件( C:\ProgramData\docker\config\daemon.json) ,电脑中没有该文件,新建一

记录日常疑问 3875

【LeetCode Solutions】LeetCode 81 ~ 85 题解

【LeetCode Solutions】LeetCode 81 ~ 85 题解

一只快乐的小蒟蒻~ 1010

2.0 电子凸轮 西门子1500电子凸轮使用研究1

本文研究了S7-1500T电子凸轮同步控制技术,通过仿真实验得出以下结论:1)通过比例系数可调整凸轮曲线形状;2)解除同步需调用从轴其他运动指令;3)详细阐述了凸轮同步的5个实施步骤。重点分析了三种同步类型(主值距离同步、动态参数同步和直接同步)的特点及应用场景,并探讨了缩放系数、偏移量等参数对凸轮曲线的影响。同时介绍了凸轮应用模式及常见异常处理方法,为工程应用提供了重要参考。

qq_34047402的博客 809

【Altium Designer】Off grid pin解决方法

​今天我画完原理图编译时,出现了太多的黄色(出现warning警告提示)Off grid pin警告,这个警告并不是原理图电气连接出问题了,而是元器件或器件PIN脚没有和栅格对齐造成的原因。再编译还是出现这个警告。 最后经过不断翻阅网上经验和实践,才最终解决,本经验详细记录了解决该警告的有效方法。 解决方案:以下是问题解决步骤... ​

夜半少年的博客 7548

Leetcode Hot100 81-85

思路:遇到陆地就ans+1,然后把周围的陆地都变为海洋。

Tom336853的博客 309

EfficientNet 改进:添加混合卷积提取特征

混合卷积(Mixed Convolution)是一种在卷积神经网络(CNN)中结合多种卷积操作的策略,旨在通过融合不同卷积核大小或类型的卷积操作来提升模型的性能和灵活性。:例如标准卷积、深度可分离卷积(Depthwise Separable Convolution)、分组卷积(Grouped Convolution)等,可以在计算效率和特征提取能力之间取得平衡。混合卷积可以根据任务需求动态调整卷积操作的组合方式,适应不同的输入数据分布。:通过引入可学习的权重,动态调整不同卷积操作的贡献。

Henry的博客 660

LeetCode 81~85

前言 本文隶属于专栏《LeetCode 刷题汇总》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构请见LeetCode 刷题汇总 正文 幕布 幕布链接 81. 搜索旋转排序数组 II 题解 官方题解​ 先判断 target 位于中间的,left <= target < mid,mid < target <= right class Solution { public boolean search(int[] nums, int

Shockang的博客 6417

5.1 直流无刷电机(BLDC):基本控制概念

本文系统介绍了直流无刷电机(BLDC)控制系统的核心概念与技术。主要内容包括:控制系统的分层结构设计,开环与闭环控制的原理及特点,PWM调速技术及其调制方式,PID控制算法及其数字化实现方法,以及控制系统的性能评估指标。同时探讨了现代BLDC控制器硬件实现方案,并介绍了磁场定向控制(FOC)、直接转矩控制(DTC)等先进控制策略。文章全面阐述了BLDC电机控制从基本原理到前沿技术的知识体系,为相关应用提供了理论指导和技术参考。

技术工作者 490

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【JavaScript】LeetCode:81-85

【代码】【JavaScript】LeetCode:81-85。

weixin_45980065的博客 769

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

leetcode/81-85

leetcode337-打家劫舍||338-比特位计数347-前k个高频元素 337-打家劫舍|| 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。 计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。 示例 1: 输入: [3,2,3,null,3

fan__lee的博客 293

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

leetcode题解python版:81-85

81、搜索旋转排序数组 II 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 解:这道题与33题相似,但33题中不存在重复元素,而本题中存在重复元素.这里我们有一种简便方法,即不去找最大的元素,而是直接找target。 class Solution: def search(self, nums: List

baidu_41689104的博客 299

LeetCode 实践练习81-85

LeetCode—81(搜索旋转排序数组II) 方法:与33题类似,都是搜索旋转排序数组,但是33题假设数组中不存在重复数组,而本体没有。时间复杂度O(logn)O(logn)O(logn),依旧是利用规律,用mid表示中间数,当mid<right时,右边有序。当mid>right时,左边有序。若想等,right左移。 C++代码: class Solution { public: ...

qq_40104034的博客 257

力扣爆刷第119天之CodeTop100五连刷81-85

思路:最长重复子数组是连续的子数组,定义dp[i][j]表示,以nums1[i]和nums2[j]为结尾的区间的最长重复子数组,根据这个定义,若nums1[i]!思路:列表无序,也不要求顺序,求最长连续序列,还要求O(N),那么就不能排序了,可以利用set集合,如果连续一定是一段一段的,我们只需要找到每一个连续段的开头,从这个地方开始技术,全部统计完就可以,注意,只从连续段的头开始计算。思路:本题求最大宽度,是需要利用满二叉树的特性的,采用前序遍历,给每一个节点编号,root=id,左孩子=id。

qq_43511039的博客 964

力扣爆刷第99天之hot100五连刷81-85

思路:定义dp[i]表示正数i所需的最少完全平方数为dp[i],那么对于每一个dp[i],我们从i值向后找,减去一个完全平方数看看是否存在,存在就在上一个位置加1,如dp[12]=dp[8]+1, dp[8]=dp[4]+1,dp[4] =dp[0]+1,dp[0]=0。思路:典型的动态规划,当前的状态依赖于当前与前一个位置,newDp[i]=dp[i]+dp[i-1],之后再交换newDp与dp避免数据覆盖。偷:需要间隔一间,dp[i] = dp[i-2] + nums[i]。

qq_43511039的博客 502

每日5题Day17 - LeetCode 81 - 85

【代码】每日5题Day17 - LeetCode 81 - 85。

alimamaalala的博客 424

leetcode刷题(81)——85. 最大矩形

一、题目 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例: 输入: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] 输出: 6 二、思路——单调栈 利用 84. 柱状图中最大的矩形 来解决这道题。 看下面的橙色部分,每一幅图都和 84 题是一样的。 图片来自 详细通俗的思路分析,多解法 因此,我们求出

kezhou的博客 2368

面试笔试杂项积累-leetcode 81-85

81.81-Search in Rotated Sorted Array II-Difficulty: Medium Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this affect the run-time complexity? How and why?

wolf96的专栏 587

力扣爆刷第163天之TOP100五连刷81-85(回文链表、路径和、最长重复子数组)

思路:求最长重复子数组,也是很经典的动态规划题目,子数组是连续的,定义dp[i][j]表示以nums1[i]和nums2[j]为结尾的最长重复子数组的长度,根据定义来看,如果nums1[i] == nums2[j] 那么dp[i][j] = dp[i-1][j-1],这是因为如果结尾相等,那么他们的长度自然依赖于上一个状态,如果不等自然是0。题目链接:https://leetcode.cn/problems/maximum-width-of-binary-tree/description/

qq_43511039的博客 645

Python小白 Leetcode刷题历程 No.81-No.85 搜索旋转排序数组Ⅱ、删除排序链表中的重复元素Ⅱ、删除排序链表中的重复元素、柱状图中最大的矩形、最大矩形(有题干 有代码 有思路)

文章目录Python小白 Leetcode刷题历程 No.81-No.85 搜索旋转排序数组Ⅱ、删除排序链表中的重复元素Ⅱ、删除排序链表中的重复元素、柱状图中最大的矩形、最大矩形写在前面:No.81.搜索旋转排序数组ⅡNo.82.删除排序链表中的重复元素ⅡNo.83.删除排序链表中的重复元素No.84.柱状图中最大的矩形No.85.最大矩形 Python小白 Leetcode刷题历程 ...

LanXiu_的博客 527
上一篇: leetcode(76-80)
下一篇: leetcode(86-90)
小小螺丝刀
博客等级 码龄10年 41粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值