力扣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
相关推荐
_殊途1 小时前
《Java HashMap底层原理全解析(源码+性能+面试)》
java·数据结构·算法
珊瑚里的鱼4 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
秋说5 小时前
【PTA数据结构 | C语言版】顺序队列的3个操作
c语言·数据结构·算法
lifallen6 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
liupenglove6 小时前
自动驾驶数据仓库:时间片合并算法。
大数据·数据仓库·算法·elasticsearch·自动驾驶
python_tty7 小时前
排序算法(二):插入排序
算法·排序算法
然我7 小时前
面试官:如何判断元素是否出现过?我:三种哈希方法任你选
前端·javascript·算法
F_D_Z8 小时前
【EM算法】三硬币模型
算法·机器学习·概率论·em算法·极大似然估计
秋说8 小时前
【PTA数据结构 | C语言版】字符串插入操作(不限长)
c语言·数据结构·算法
凌肖战9 小时前
力扣网编程135题:分发糖果(贪心算法)
算法·leetcode