100个python代码大全(二十)

题目1:两数之和

问题描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

解题思路:使用哈希表来存储已遍历过的元素及其下标,以便快速查找目标值的补数。

Python代码示例

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

题目2:有效的括号

问题描述:给定一个只包括 ‘(‘,’)’,'{‘,’}’,'[‘,’]’ 的字符串,判断字符串是否有效。

解题思路:使用栈来跟踪括号的开闭状态。

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

题目3:最长公共前缀

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

解题思路:比较所有字符串的前缀,逐字符检查。

Python代码示例

def longestCommonPrefix(strs):
    if not strs: return ""
    prefix = strs[0]
    for i in range(1, len(strs)):
        while strs[i].find(prefix) != 0:
            prefix = prefix[:-1]
            if not prefix: return ""
    return prefix

题目4:合并两个有序数组

问题描述:给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。

解题思路:从后往前遍历两个数组,将较大的数放入 nums1 的末尾。

Python代码示例

def merge(nums1, m, nums2, n):
    while m > 0 and n > 0:
        if nums1[m-1] > nums2[n-1]:
            nums1[m+n-1] = nums1[m-1]
            m -= 1
        else:
            nums1[m+n-1] = nums2[n-1]
            n -= 1
    while n > 0:
        nums1[n-1] = nums2[n-1]
        n -= 1

题目5:搜索插入位置

问题描述:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

解题思路:使用二分查找定位插入位置。

Python代码示例

def searchInsert(nums, target):
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = left + (right - left) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return left

题目6:数组中的逆序对

问题描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

解题思路:使用归并排序,统计逆序对数目。

Python代码示例

def inversePairs(data):
    if not data:
        return 0
    copy = [0 for _ in range(len(data))]
    count = mergeSort(data, copy, 0, len(data) - 1)
    return count % 1000000007

def mergeSort(data, copy, start, end):
    if start == end:
        copy[start] = data[start]
        return 0
    mid = (start + end) // 2
    leftCount = mergeSort(data, copy, start, mid)
    rightCount = mergeSort(data, copy, mid + 1, end)
    i, j = mid, end
    indexCopy = end
    number = 0
    while i >= start and j >= mid + 1:
        if data[i] > data[j]:
            copy[indexCopy] = data[i]
            indexCopy -= 1
            i -= 1
            number += j - mid
        else:
            copy[indexCopy] = data[j]
            indexCopy -= 1
            j -= 1
    for k in range(i, start - 1, -1):
        copy[indexCopy] = data[k]
        indexCopy -= 1
    for k in range(j, mid, -1):
        copy[indexCopy] = data[k]
        indexCopy -= 1
    for k in range(start, end + 1):
        data[k] = copy[k]
    return leftCount + rightCount + number

题目7:链表中环的入口节点

问题描述:给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回 null。

解题思路:使用快慢指针找到环中的任意一点,然后从起点和环中点出发,再次相遇即为环的入口。

Python代码示例

def detectCycle(head):
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            break
    else:
        return None
    slow = head
    while slow != fast:
        slow = slow.next
        fast = fast.next
    return slow

题目8:字符串的排列

问题描述:输入一个字符串,打印出该字符串中字符的所有排列。

解题思路:使用回溯算法,递归生成所有可能的排列。

Python代码示例

def permutation(s):
    def backtrack(start):
        if start == len(s) - 1:
            res.append(''.join(s))
        for i in range(start, len(s)):
            if i > start and s[i] == s[start]:
                continue
            s[start], s[i] = s[i], s[start]
            backtrack(start + 1)
            s[start], s[i] = s[i], s[start]
    s = list(s)
    s.sort()
    res = []
    backtrack(0)
    return res

题目9:二叉树的最近公共祖先

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

解题思路:递归遍历二叉树,寻找目标节点,利用递归返回值传递信息。

Python代码示例

def lowestCommonAncestor(root, p, q):
    if not root or root == p or root == q:
        return root
    left = lowestCommonAncestor(root.left, p, q)
    right = lowestCommonAncestor(root.right, p, q)
    if not left:
        return right
    if not right:
        return left
    return root

题目10:最长上升子序列

问题描述:给定一个无序的整数数组,找到其中最长上升子序列的长度。

解题思路:动态规划,使用一个数组记录以每个元素结尾的最长上升子序列的长度。

Python代码示例

def lengthOfLIS(nums):
    if not nums:
        return 0
    dp = [1] * len(nums)
    for i in range(len(nums)):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)

题目11:搜索旋转排序数组

问题描述:假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]。请你在旋转排序数组中搜索给定的目标值 target,如果数组中存在这个目标值 target ,则返回它的索引,否则返回 -1

解题思路:二分查找,需要处理好边界条件和旋转情况。

Python代码示例

def search(nums, target):
    if not nums:
        return -1
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        if nums[left] <= nums[mid]:
            if nums[left] <= target < nums[mid]:
                right = mid - 1
            else:
                left = mid + 1
        else:
            if nums[mid] < target <= nums[right]:
                left = mid + 1
            else:
                right = mid - 1
    return -1

题目12:最佳买卖股票时机含手续费

问题描述:给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回最大可以得到利润。

解题思路:动态规划,定义 hold 表示持有股票的最大收益,not_hold 表示不持有股票的最大收益。

Python代码示例

def maxProfit(prices, fee):
    hold, not_hold = -prices[0], 0
    for price in prices[1:]:
        hold = max(hold, not_hold - price)
        not_hold = max(not_hold, hold + price - fee)
    return not_hold

题目13:岛屿数量

问题描述:给你一个由 ‘1’(陆地)和 ‘0’(水)组成的二维网格,请你计算网格中岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

解题思路:深度优先搜索(DFS),对于每一个陆地位置,使用DFS标记并计数。

Python代码示例

def numIslands(grid):
    if not grid:
        return 0
    m, n = len(grid), len(grid[0])
    def dfs(x, y):
        if x < 0 or y < 0 or x >= m or y >= n or grid[x][y] == '0':
            return
        grid[x][y] = '0'
        dfs(x+1, y)
        dfs(x-1, y)
        dfs(x, y+1)
        dfs(x, y-1)
    count = 0
    for i in range(m):
        for j in range(n):
            if grid[i][j] == '1':
                dfs(i, j)
                count += 1
    return count

题目14:单词接龙

问题描述:给出两个单词 beginWord 和 endWord 和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:

  1. 每次转换只能改变一个字母。
  2. 转换过程中的中间单词必须是字典中的单词。

解题思路:广度优先搜索(BFS),构建图的邻接表,然后使用 BFS 寻找最短路径。

Python代码示例

from collections import deque, defaultdict
def findLadders(beginWord, endWord, wordList):
    wordList = set(wordList)
    if endWord not in wordList:
        return []
    layer = {}
    layer[beginWord] = [[beginWord]]
    while layer:
        newLayer = defaultdict(list)
        for word in layer:
            if word == endWord:
                return layer[word]
            for i in range(len(word)):
                for c in 'abcdefghijklmnopqrstuvwxyz':
                    newWord = word[:i] + c + word[i+1:]
                    if newWord in wordList:
                        newLayer[newWord] += [j + [newWord] for j in layer[word]]
        wordList -= set(newLayer.keys())
        layer = newLayer
    return []

题目15:全拼

问题描述:给定一个字符串 s,返回所有可能的全拼组合。输入字符串将只包含小写字母。你可以按任意顺序返回答案。

解题思路:使用哈希表存储字母与数字的对应关系,然后使用递归来生成所有可能的组合。

Python代码示例

def letterCombinations(digits):
    if not digits:
        return []
    phoneMap = {
        '2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl',
        '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz'
    }
    ans = []

    def backtrack(index, path):
        if len(path) == len(digits):
            ans.append("".join(path))
            return
        for option in phoneMap[digits[index]]:
            path.append(option)
            backtrack(index + 1, path)
            path.pop()

    backtrack(0, [])
    return ans

题目16:跳跃游戏 II

问题描述:给定一个非负整数数组 nums,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。

解题思路:贪心算法,记录当前能够达到的最远位置和每次跳跃后能够达到的最远位置。

Python代码示例

def jump(nums):
    jumps = 0
    current_jump_end = 0
    farthest = 0
    for i in range(len(nums) - 1):
        farthest = max(farthest, i + nums[i])
        if i == current_jump_end:
            jumps += 1
            current_jump_end = farthest
            if current_jump_end >= len(nums) - 1:
                break
    return jumps

题目17:接雨水

问题描述:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算在下雨之后,能够接多少雨水。

解题思路:动态规划,分别从左向右和从右向左计算左右两侧的最大高度。

Python代码示例

def trap(height):
    if not height:
        return 0
    left_max = [0] * len(height)
    right_max = [0] * len(height)
    left_max[0] = height[0]
    for i in range(1, len(height)):
        left_max[i] = max(left_max[i-1], height[i])
    right_max[-1] = height[-1]
    for i in range(len(height)-2, -1, -1):
        right_max[i] = max(right_max[i+1], height[i])
    ans = sum(min(left_max[i], right_max[i]) - height[i] for i in range(len(height)))
    return ans

题目18:最小路径和

问题描述:给定一个 m x n 的网格 grid,其中每个单元格都含有非负整数,找到一条从左上角到右下角的路径,使得路径上的数字之和最小。

解题思路:动态规划,更新每个位置的最小路径和。

Python代码示例

def minPathSum(grid):
    m, n = len(grid), len(grid[0])
    for i in range(m):
        for j in range(n):
            if i == 0 and j == 0:
                continue
            elif i == 0:
                grid[i][j] += grid[i][j-1]
            elif j == 0:
                grid[i][j] += grid[i-1][j]
            else:
                grid[i][j] += min(grid[i-1][j], grid[i][j-1])
    return grid[-1][-1]

题目19:合并区间

问题描述:给出一系列区间,合并所有重叠的区间。

解题思路:先对区间按照起点进行排序,然后遍历区间,如果当前区间的终点大于等于下一个区间的起点,则需要合并这两个区间。

Python代码示例

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

题目20:二叉树的最近公共祖先

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

解题思路:递归,从根节点开始向下查找两个节点,当遇到一个节点时,检查它的左右子树是否同时包含这两个节点。

Python代码示例

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

def lowestCommonAncestor(root, p, q):
    if root is None or root == p or root == q:
        return root
    left = lowestCommonAncestor(root.left, p, q)
    right = lowestCommonAncestor(root.right, p, q)
    if left is not None and right is not None:
        return root
    return left if left is not None else right

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

(0)
guozi的头像guozi
上一篇 2024年6月7日 上午10:37
下一篇 2024年6月7日 上午10:44

相关推荐

发表回复

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