leecode第17天

1346.检查整数及其两倍数是否存在
# 给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。
# 更正式地,检查是否存在两个下标 i 和 j 满足:
# i != j
# 0 <= i, j < arr.length
# arr[i] == 2 * arr[j]

class Solution(object):
    def checkIfExist(self, arr):
        """
        :type arr: List[int]
        :rtype: bool
        """
        s=0
        for item in arr:
            #处理只有一个0不满足要求的情况
            if item==0:
                s+=1
                if s>=2:
                    return True

            elif item*2 in arr:
                return True

        return False

问题分析与优化建议

1. 潜在问题
  • 重复查找问题:在 elif item*2 in arr: 这一行中,in 操作的时间复杂度为 O(n),导致整体时间复杂度为 O(n^2)。对于较大的输入数组,性能会显著下降。
  • 边界条件未充分考虑:虽然代码逻辑基本正确,但如果数组为空 (arr = []),代码会直接返回 False,这符合题意,但需要明确说明。
  • 变量命名不够清晰:变量 s 的命名不够直观,可能会让代码的可读性降低。
2. 优化方向
  • 使用哈希集合优化查找:通过维护一个哈希集合(set),可以将查找操作的时间复杂度从 O(n) 降低到 O(1),从而将整体时间复杂度优化为 O(n)。
  • 改进变量命名:将变量 s 改为更具语义化的名称,例如 zero_count,以提高代码的可读性。
  • 提前退出优化:如果数组为空,可以直接返回 False,避免不必要的循环。
class Solution(object):
    def checkIfExist(self, arr):
        """
        :type arr: List[int]
        :rtype: bool
        """
        if not arr:  # 如果数组为空,直接返回 False
            return False

        seen = set()  # 使用哈希集合存储已经遍历过的元素
        zero_count = 0  # 记录零的数量

        for item in arr:
            if item == 0:
                zero_count += 1
                if zero_count >= 2:  # 如果有至少两个零,返回 True
                    return True
            else:
                if item * 2 in seen or (item % 2 == 0 and item // 2 in seen):  # 检查是否存在两倍或一半的值
                    return True

            seen.add(item)  # 将当前元素加入集合

        return False
605.种花问题
# 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,
# 它们会争夺水源,两者都会死去。

# 给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,
# 1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。
class Solution(object):
    def canPlaceFlowers(self, flowerbed, n):
        """
        判断能否在花床中种入n朵花,而不违反花之间必须有空地的规则。
        
        :type flowerbed: List[int] 花床的表示,0表示空地,1表示已种花。
        :type n: int 需要种入的花的数量。
        :rtype: bool 表示是否能种入n朵花。
        """

        # 如果需要种的花的数量小于等于0,直接返回True
        if n <= 0:
            return True
        
        # 将花床列表转换为字符串,便于后续处理
        f_s = ''.join(map(str, flowerbed))
        # 以1为分隔符,将字符串分割为多个空地段
        f_lst = f_s.split('1')
        # 初始化可以种的花的数量
        N = 0

        # 如果只有一个空地段
        if len(f_lst) == 1:
            # 如果空地长度为偶数,可以种的花的数量是长度的一半
            if len(f_lst[0]) % 2 == 0:
                N = len(f_lst[0]) // 2
            else:
                # 如果空地长度为奇数,可以种的花的数量是(长度+1)的一半
                N = (len(f_lst[0]) + 1) // 2
            # 返回是否可以种入n朵花
            return N >= n

        # 对于多个空地段,计算每个空地段可以种的花的数量
        for i in range(len(f_lst)):
            # 对于开头和结尾的空地段
            if i == 0 or i == len(f_lst) - 1:
                # 如果空地段长度为0,则不进行计算
                if len(f_lst[i]) ==0:
                    N=N
                else:
                    # 对于开头和结尾的空地,可以种植的花的数量是 length // 2
                    N += (len(f_lst[i]) ) // 2
            else:
                # 对于中间的空地段
                if len(f_lst[i]) ==0:
                    N=N
                else:
                    # 对于中间的空地,可以种植的花的数量是 (length - 1) // 2
                    N += (len(f_lst[i]) - 1) // 2
        # 返回是否可以种入n朵花
        return N >= n
当前提供的引用内容并未涉及 LeetCode 第 25 题的信息。然而,基于已知的 LeetCode 平台题目编号规律以及常见问题分类,可以推测 LeetCode 第 25 题通常是指 **"Reverse Nodes in k-Group"**(k 个一组翻转链表)。以下是关于此问题的专业解答: ### 问题描述 给定一个链表,将其节点按照每 k 个一组进行反转。如果剩余节点不足 k 个,则保持原样。返回修改后的链表。 #### 示例输入输出 ```plaintext Input: head = [1,2,3,4,5], k = 2 Output: [2,1,4,3,5] Input: head = [1,2,3,4,5], k = 3 Output: [3,2,1,4,5] ``` --- ### 解决方案 为了实现这一功能,可以通过迭代的方式处理链表节点组,并利用辅助函数完成单组内的反转操作。具体方法如下: #### 方法概述 1. 使用指针 `start` 和 `end` 定位每一组的第一个和最后一个节点。 2. 对于满足长度为 k 的子链表部分,调用辅助函数对其进行局部反转。 3. 将上一步的结果连接回原始链表结构。 4. 如果最后剩余的部分少于 k 个节点,则不作任何改动。 下面是完整的 Python 实现代码: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def reverseKGroup(head: ListNode, k: int) -> ListNode: dummy = ListNode(0) dummy.next = head prev_group_end = dummy # 跟踪前一段链表的结尾 while True: # 检查是否有足够的节点来形成下一组 current_node = prev_group_end for _ in range(k): if not current_node.next: return dummy.next current_node = current_node.next # 反转当前组 (prev_group_end.next 到 current_node) new_group_start = prev_group_end.next temp_next = current_node.next prev_group_end.next, current_tail = reverseSubList(new_group_start, k) # 连接反转后的组到整体链表 current_tail.next = temp_next prev_group_end = current_tail def reverseSubList(head: ListNode, count: int) -> tuple[ListNode]: """ 辅助函数:用于反转指定数量的节点 """ previous = None current = head for _ in range(count): next_temp = current.next current.next = previous previous = current current = next_temp return previous, head # 返回新的头结点和旧的头结点作为尾部 ``` 上述算法的时间复杂度为 O(n),其中 n 是链表中节点的数量;空间复杂度为 O(1)[^6]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值