力扣81~85题

题81(中等):

python代码:

复制代码
class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        # 显然与折半查找类似嘛
        left, right = 0, len(nums) - 1

        while left <= right:
            mid = (left + right) // 2
            if nums[mid] == target:
                return True

            # 判断左侧是否有序
            if nums[mid] > nums[left]:
                # target在左侧范围内
                if nums[left] <= target < nums[mid]:
                    right = mid - 1
                else:
                    left = mid + 1
            elif nums[mid] == nums[left]:
                left += 1
            else:
                # target在右侧范围内
                if nums[mid] < target <= nums[right]:
                    left = mid + 1
                else:
                    right = mid - 1

        return False

题82(中等):

python代码

复制代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        #做一个伪表头
        new_head=ListNode(None,head)
        q,p=new_head,head
        if p==None:
            return head
        flag=0
        while p.next!=None:
            if p.val==p.next.val:
                print(p.val)
                p.next=p.next.next
                flag=1
            else:
                if flag==1:
                    q.next=p.next
                    p=p.next
                else:
                    q=p
                    p=p.next          
                flag=0
        if flag==1:
            q.next=p.next
            p=p.next
        return new_head.next

题83(简单):

python代码:

复制代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        p=head
        if p==None:
            return p
        while p.next!=None:
            if p.val==p.next.val:
                p.next=p.next.next
            else:
                p=p.next
        return head

题84(困难)

分析

这题我开始思路就是遍历强算,确定左右计算面积。但是时间复杂度肯定是n^2,所以没过,难度其实挺高,然后我看评论,单调栈?啥玩意,不懂,不过现在学了一下。我们知道如果算面积肯定用最小的那个作为高,所以我们就找比它矮的,一旦遇到就进行面积计算,因为这个时候带着这个新来的高度肯定要变,所以我们依次和以径进栈的高度比高,找到不用变高度的程度。还有一点,这道题应该是要记录下标(来计算宽度)

复制代码
class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        h_stack=[]
        max_res=0
        #使用单调栈来求解
        for i in range(len(heights)):
            #如果这个元素大于栈顶
            if h_stack==[] or heights[i]>=heights[h_stack[-1]]:
                h_stack.append(i)
            #如果小于栈顶
            else:

                #将元素依次出栈直到遇到比它大的
                while 1:
                    #如果出完了
                    if h_stack==[]:
                        break
                    if heights[i]>heights[h_stack[-1]]:
                        break
                    else:
                        element=h_stack.pop()
                        if h_stack==[]:
                            width=i
                        else:
                            width=i-h_stack[-1]-1
                        max_res=max(max_res,heights[element]*width)
                h_stack.append(i)

        while 1:
            # 如果出完了
            if h_stack == []:
                break
            else:
                element = h_stack.pop()
                if h_stack==[]:
                    width=len(heights)
                else:
                    width=len(heights) - h_stack[-1]-1
                max_res = max(max_res, heights[element] * width)

        return  max_res

题85(困难):

分析:

好家伙,又来一道难度高的题目,要不是我想到上一题就搞不出来了

python代码

复制代码
class Solution:

    def largestRectangleArea(self, heights: List[int]) -> int:
        h_stack = []
        max_res = 0
        # 使用单调栈来求解
        for i in range(len(heights)):
            # 如果这个元素大于栈顶
            if h_stack == [] or heights[i] >= heights[h_stack[-1]]:
                h_stack.append(i)
            # 如果小于栈顶
            else:
                # 将元素依次出栈直到遇到比它大的
                while 1:
                    # 如果出完了
                    if h_stack == []:
                        break
                    if heights[i] > heights[h_stack[-1]]:
                        break
                    else:
                        element = h_stack.pop()
                        if h_stack == []:
                            width = i
                        else:
                            width = i - h_stack[-1] - 1
                        max_res = max(max_res, heights[element] * width)
                h_stack.append(i)

        while 1:
            # 如果出完了
            if h_stack == []:
                break
            else:
                element = h_stack.pop()
                if h_stack == []:
                    width = len(heights)
                else:
                    width = len(heights) - h_stack[-1] - 1
                max_res = max(max_res, heights[element] * width)

        return max_res

    def maximalRectangle(self, matrix: List[List[str]]) -> int:
        row = len(matrix)
        col = len(matrix[0])
        res=0
        height=[0 for i in range(col)]
        for i in range(row):
            for j in range(col):
                if matrix[i][j]=="1":
                    height[j]+=1
                else:
                    height[j]=0
            res=max(res,self.largestRectangleArea(height))
        return res
相关推荐
海砥装备HardAus几秒前
飞控算法中双环串级PID深度解析:角度环与角速度环的协同机制
stm32·算法·无人机·飞控·串级pid
宵时待雨2 分钟前
优选算法专题1:双指针
数据结构·c++·笔记·算法·leetcode
zsc_1183 分钟前
pvz3解码小游戏求解算法
算法
汀、人工智能5 分钟前
[特殊字符] 第107课:LRU缓存(最后一课[特殊字符])
数据结构·算法·链表·数据库架构·哈希表·lru缓存
数据知道11 分钟前
claw-code 源码分析:结构化输出与重试——`structured_output` 一类开关如何改变「可解析性」与失败语义?
算法·ai·claude code·claw code
tankeven12 分钟前
HJ172 小红的矩阵染色
c++·算法
2301_8227032016 分钟前
Flutter 框架跨平台鸿蒙开发 - 智能植物生长记录应用
算法·flutter·华为·harmonyos·鸿蒙
每日任务(希望进OD版)20 分钟前
线性DP、区间DP
开发语言·数据结构·c++·算法·动态规划
放羊郎25 分钟前
机器人跟随算法
算法·机器人
liu****27 分钟前
第十五届蓝桥杯大赛软件赛国赛C/C++大学B组
c++·算法·蓝桥杯·acm