100个python代码大全

Python代码示例:

def twoSum(nums, target):
    hashmap = {}
    for index, num in enumerate(nums):
        complement = target - num
        if complement in hashmap:
            return [hashmap[complement], index]
        hashmap[num] = index
    return None

题目2:有效的括号

问题描述:给定一个只包括 ‘(‘,’)’,'{‘,’}’,'[‘,’]’ 的字符串 s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合,左括号必须以正确的顺序闭合。

解题思路:栈。遍历字符串,遇到左括号就将其压入栈,遇到右括号则检查栈顶的左括号是否匹配,匹配则弹出栈顶元素,否则返回 False。最后,如果栈为空则说明字符串有效。

Python代码示例:

def isValid(s):
    bracket_map = {")": "(", "}": "{", "]": "["}
    stack = []
    for char in s:
        if char in bracket_map:
            top_element = stack.pop() if stack else '#'
            if bracket_map[char] != top_element:
                return False
        else:
            stack.append(char)
    return not stack

题目3:无重复字符的最长子串

问题描述:给定一个字符串 s,请你找出其中不含有重复字符的 最长子串 的长度。

解题思路:滑动窗口。使用双指针定义一个窗口,不断向右扩展窗口直到遇到重复字符,此时窗口左边界向右移动一位,同时更新最长子串的长度。

Python代码示例:

def lengthOfLongestSubstring(s):
    char_index_map = {}
    left = 0
    max_length = 0
    for right, char in enumerate(s):
        if char in char_index_map and char_index_map[char] >= left:
            left = char_index_map[char] + 1
        char_index_map[char] = right
        max_length = max(max_length, right - left + 1)
    return max_length

题目4:寻找两个正序数组的中位数

问题描述:给定两个大小分别为 m 和 n 的正序数组 nums1 和 nums2。请你找出这两个正序数组的中位数。

解题思路:二分查找。合并两个数组会超时,故采用二分查找思想在较小的数组中寻找合适的分割点,使得左边部分的元素数量等于右边部分,从而找到中位数。

Python代码示例:

def findMedianSortedArrays(nums1, nums2):
    if len(nums1) > len(nums2):
        nums1, nums2 = nums2, nums1
        
    x, y = len(nums1), len(nums2)
    low = 0
    high = x
    
    while low <= high:
        partitionX = (low + high) // 2
        partitionY = (x + y + 1) // 2 - partitionX
        
        maxLeftX = float('-inf') if partitionX == 0 else nums1[partitionX - 1]
        minRightX = float('inf') if partitionX == x else nums1[partitionX]
        
        maxLeftY = float('-inf') if partitionY == 0 else nums2[partitionY - 1]
        minRightY = float('inf') if partitionY == y else nums2[partitionY]
        
        if maxLeftX <= minRightY and maxLeftY <= minRightX:
            if (x + y) % 2 == 0:
                return (max(maxLeftX, maxLeftY) + min(minRightX, minRightY)) / 2
            else:
                return max(maxLeftX, maxLeftY)
        elif maxLeftX > minRightY:
            high = partitionX - 1
        else:
            low = partitionX + 1
            
    return 0

题目5:最长回文子串

问题描述:给定一个字符串 s,找到这个字符串中最长的回文子串。

解题思路:动态规划或中心扩散法。动态规划方法中,定义一个二维数组 dp,其中 dp[i][j] 表示字符串区间 [i, j] 是否为回文串。中心扩散法则从每个字符出发,向两边扩展,记录最长的回文子串。

Python代码示例(动态规划法):

def longestPalindrome(s):
    if not s:
        return ""
    n = len(s)
    dp = [[False]*n for _ in range(n)]
    start = 0
    maxLength = 1
    for i in range(n):
        dp[i][i] = True
    for L in range(2, n+1):
        for i in range(n-L+1):
            j = i + L - 1
            if s[i] == s[j] and (L == 2 or dp[i+1][j-1]):
                dp[i][j] = True
                if L > maxLength:
                    maxLength = L
                    start = i
    return s[start:start+maxLength]

题目6:岛屿数量

问题描述:给定一个二维网格地图,用字符 ‘1’ 表示陆地,’0′ 表示水域,请计算网格中岛屿的数量。岛屿是由水平或垂直相邻的陆地组成的,并且相邻的陆地不能通过水域相连接。

解题思路:深度优先搜索(DFS)或广度优先搜索(BFS)。遍历整个网格,遇到陆地(’1’)时,进行深度或广度优先遍历,将访问过的陆地标记为已访问(例如标记为’0’),以避免重复计数。

Python代码示例(DFS):

def dfs(grid, i, j):
    if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]) or grid[i][j] != '1':
        return
    grid[i][j] = '0'
    dfs(grid, i + 1, j)
    dfs(grid, i - 1, j)
    dfs(grid, i, j + 1)
    dfs(grid, i, j - 1)

def numIslands(grid):
    count = 0
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if grid[i][j] == '1':
                dfs(grid, i, j)
                count += 1
    return count

题目7:合并区间

问题描述:给定一个区间的列表,请合并所有重叠的区间。

解题思路:排序 + 贪心。首先按照区间的起始位置对所有区间进行排序,然后遍历排序后的区间列表,对于每个区间,如果它与上一个区间重叠,则合并这两个区间,否则将当前区间加入结果列表。

Python代码示例:

def merge(intervals):
    if not intervals:
        return []
    
    intervals.sort(key=lambda x: x[0])
    merged = [intervals[0]]
    
    for interval in intervals[1:]:
        if interval[0] <= merged[-1][1]:
            merged[-1][1] = max(merged[-1][1], interval[1])
        else:
            merged.append(interval)
    
    return merged

题目8:括号生成

问题描述:给定一个整数 n,生成所有可能的由 n 对括号组成的合法组合。

解题思路:回溯算法。通过递归生成所有可能的组合,同时保证在任何时候左括号的数量都不小于右括号的数量,以保证生成的括号组合是合法的。

Python代码示例:

def generateParenthesis(n):
    def backtrack(S='', left=0, right=0):
        if len(S) == 2*n:
            res.append(S)
            return
        if left < n:
            backtrack(S+'(', left+1, right)
        if right < left:
            backtrack(S+')', left, right+1)
            
    res = []
    backtrack()
    return res

题目9:最接近的三数之和

问题描述:给定一个包括 n 个整数的数组 nums 和一个目标值 target,找出 nums 中和为目标值的那三个整数,返回这三个数的和。你可以假设每个输入都只有一个答案,且同样的元素不能被重复利用。

解题思路:排序 + 双指针。首先对数组进行排序,然后遍历数组,对于每个元素,使用双指针找到剩下元素中和最接近 target 的两个元素。

Python代码示例:

def threeSumClosest(nums, target):
    nums.sort()
    closest = sum(nums[:3])
    for i in range(len(nums) - 2):
        left, right = i + 1, len(nums) - 1
        while left < right:
            cur_sum = nums[i] + nums[left] + nums[right]
            if abs(cur_sum - target) < abs(closest - target):
                closest = cur_sum
            if cur_sum < target:
                left += 1
            elif cur_sum > target:
                right -= 1
            else:
                return closest
    return closest

题目10:跳跃游戏

问题描述:给定一个非负整数数组,你最初位于数组的第一个位置,数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。

解题思路:贪心算法。维护一个可达到的最大位置,每次更新这个最大位置,如果这个最大位置能覆盖数组的最后一个位置,则可以到达终点。

Python代码示例:

def canJump(nums):
    max_reach = 0
    for i in range(len(nums)):
        if i > max_reach:
            return False
        max_reach = max(max_reach, i + nums[i])
        if max_reach >= len(nums) - 1:
            return True
    return False

题目11:最长公共前缀

问题描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。

解题思路:横向扫描。比较字符串数组中每个字符串的对应字符,逐步缩小公共前缀的候选范围。

Python代码示例:

def longestCommonPrefix(strs):
    if not strs:
        return ""
    
    prefix = strs[0]
    for s in strs[1:]:
        while s[:len(prefix)] != prefix and prefix:
            prefix = prefix[:len(prefix)-1]
        if not prefix:
            break
            
    return prefix

题目12:有效的括号

问题描述:给定一个只包括 ‘(‘,’)’,'{‘,’}’,'[‘,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合;左括号必须以正确的顺序闭合。

解题思路:栈。遍历字符串,遇到左括号入栈,遇到右括号检查栈顶元素是否匹配,匹配则弹出栈顶元素,不匹配或栈为空则字符串无效。

Python代码示例:

def isValid(s):
    stack = []
    mapping = {")": "(", "}": "{", "]": "["}
    
    for char in s:
        if char in mapping:
            top_element = stack.pop() if stack else '#'
            if mapping[char] != top_element:
                return False
        else:
            stack.append(char)
    
    return not stack

题目13:二叉树的最大深度

问题描述:给定一个二叉树,找出其最大深度。二叉树的深度是指从根节点到最远叶子节点的最长路径上的节点数。

解题思路:递归。递归计算左右子树的最大深度,然后取较大者加一。

Python代码示例(假设已定义好TreeNode类):

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def maxDepth(root):
    if not root:
        return 0
    else:
        left_depth = maxDepth(root.left)
        right_depth = maxDepth(root.right)
        return max(left_depth, right_depth) + 1

题目14:反转链表

问题描述:给你单链表的头节点 head ,反转链表,并返回反转后的链表。

解题思路:迭代或递归。迭代法中,使用三个指针(prev、curr、next)逐步改变节点指向。

Python代码示例(迭代法):

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseList(head):
    prev = None
    curr = head
    while curr:
        next_node = curr.next
        curr.next = prev
        prev = curr
        curr = next_node
    return prev

题目15:最长连续序列

问题描述:给定一个未排序的整数数组 nums ,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。

解题思路:哈希表。遍历数组,对于每个元素,检查其减一的元素是否存在,若不存在,则以其为起点开始新的连续序列计数,同时更新全局最长连续序列长度。

Python代码示例:

def longestConsecutive(nums):
    num_set = set(nums)
    longest_streak = 0
    
    for num in num_set:
        if num - 1 not in num_set:
            current_num = num
            current_streak = 1
            
            while current_num + 1 in num_set:
                current_num += 1
                current_streak += 1
                
            longest_streak = max(longest_streak, current_streak)
    
    return longest_streak

题目16:最大子序和

问题描述:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组至少包含一个元素),返回其最大和。

解题思路:动态规划。使用一个变量 current_sum 来追踪当前子数组的和,另一个变量 max_sum 来记录到目前为止的最大和。遍历数组时更新这两个变量。

Python代码示例:

def maxSubArray(nums):
    current_sum = max_sum = nums[0]
    for num in nums[1:]:
        current_sum = max(num, current_sum + num)
        max_sum = max(max_sum, current_sum)
    return max_sum

题目17:合并K个排序链表

问题描述:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

解题思路:分治法/优先队列。可以用优先队列(小顶堆)存储链表的头节点,每次从堆中取出当前最小的节点,然后把该节点的下一个节点加入堆中,直到堆为空。

Python代码示例(使用优先队列):

import heapq

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def mergeKLists(lists):
    dummy = ListNode()
    current = dummy
    heap = []

    for head in lists:
        if head:
            heapq.heappush(heap, (head.val, head))

    while heap:
        val, node = heapq.heappop(heap)
        current.next = ListNode(val)
        current = current.next
        if node.next:
            heapq.heappush(heap, (node.next.val, node.next))

    return dummy.next

题目18:四数之和

问题描述:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

解题思路:排序 + 四指针。首先对数组进行排序,然后使用四个指针遍历和调整,类似于三数之和的扩展。

Python代码示例:

def fourSum(nums, target):
    nums.sort()
    n = len(nums)
    result = []
    
    for i in range(n - 3):
        if i > 0 and nums[i] == nums[i - 1]:
            continue
        for j in range(i + 1, n - 2):
            if j > i + 1 and nums[j] == nums[j - 1]:
                continue
            left, right = j + 1, n - 1
            while left < right:
                total = nums[i] + nums[j] + nums[left] + nums[right]
                if total < target:
                    left += 1
                elif total > target:
                    right -= 1
                else:
                    result.append([nums[i], nums[j], nums[left], nums[right]])
                    while left < right and nums[left] == nums[left + 1]:
                        left += 1
                    while left < right and nums[right] == nums[right - 1]:
                        right -= 1
                    left += 1
                    right -= 1
    return result

题目19:二叉搜索树的最近公共祖先

问题描述:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。

解题思路:二叉搜索树特性。由于二叉搜索树的特性(左子树所有节点小于根,右子树所有节点大于根),可以从根节点开始,根据两个节点值与当前节点值的关系,决定是在左子树还是右子树中继续查找。

Python代码示例:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def lowestCommonAncestor(root, p, q):
    while root:
        if root.val > p.val and root.val > q.val:
            root = root.left
        elif root.val < p.val and root.val < q.val:
            root = root.right
        else:
            return root
    return None

题目20:滑动窗口最大值

问题描述:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

解题思路:双端队列。维护一个单调递减的双端队列,队列中存放的是数组的索引,队首元素始终是当前窗口内的最大值。

Python代码示例:

from collections import deque

def maxSlidingWindow(nums, k):
    deq = deque()
    result = []
    
    for i in range(len(nums)):
        while deq and nums[i] > nums[deq[-1]]:
            deq.pop()
        deq.append(i)
        
        if i >= k - 1:
            result.append(nums[deq[0]])
            if deq[0] == i - k + 1:
                deq.popleft()
    
    return result

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/88105.html

(0)
guozi的头像guozi
上一篇 2024年6月3日
下一篇 2024年6月3日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注