0221leetcode刷题5道python

86

题目描述;
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。

示例:
在这里插入图片描述
解答:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def partition(self, head: ListNode, x: int) -> ListNode:
        mins = ListNode(100)
        maxs = ListNode(99)
        minb = mins
        maxb = maxs
        while(head):
            if head.val < x:
                mins.next = head
                mins = mins.next
            else:
                maxs.next = head
                maxs = maxs.next
            head = head.next
        #print mins.val,maxs.val
        if minb.next == None:
            return maxb.next
        elif maxb.next == None:
            return minb.next
        else:
            maxs.next = None
            mins.next = maxb.next
            return minb.next

141

题目描述:
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。

示例:
在这里插入图片描述
解答:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if not head:
            return False
        while head.next and head.val!=None:
            head.val=None  #遍历过的值置为空
            head=head.next
        if not head.next:  #如果碰到空发现已经结束,则无环
            return False
        return True

287

题目描述:
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。

示例:

解答:

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        left=1
        right=len(nums)
        while left<right:
            mid=int(left+(right-left)/2)
            cnt=0
            for num in nums:
                if num<=mid:
                    cnt+=1
            if cnt<=mid:
                left=mid+1
            else:
                right=mid
        return right

844

题目描述:
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。

示例:
在这里插入图片描述
解答:

class Solution:
    def backspaceCompare(self, S: str, T: str) -> bool:
        a=[]
        b=[]
        for i in range(len(S)):
            if S[i]!='#':
                a.append(S[i])
            elif S[i]=='#' and a!=[]:
                a.pop()
        for i in range(len(T)):
            if T[i]!='#':
                b.append(T[i])
            elif T[i]=='#' and b!=[]:
                b.pop()
        return a==b

1438

题目描述:
给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
如果不存在满足条件的子数组,则返回 0 。

示例:
在这里插入图片描述
解答:

class Solution:
    def longestSubarray(self, nums: List[int], limit: int) -> int:
        s_min = deque() #单调栈,栈首是当前窗口最小值
        s_max = deque() #栈首是当前窗口最大值
        length = l = r = 0
        while r < len(nums):
            if s_max and s_min and s_max[0]-s_min[0] > limit:
                if nums[l] == s_max[0]:
                    s_max.popleft()
                if nums[l] == s_min[0]:
                    s_min.popleft()
                l += 1
            else:
                # 更新当前区间最小值
                while s_min and s_min[-1] > nums[r]:
                    s_min.pop()
                s_min.append(nums[r])
                # 更新当前区间最大值
                while s_max and s_max[-1] < nums[r]:
                    s_max.pop()
                s_max.append(nums[r])
                r += 1
                if s_max[0]-s_min[0] <= limit:
                    length = max(length, r-l)
        return length

猜你喜欢

转载自blog.csdn.net/yeqing1997/article/details/113913431