力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。
--点击进入刷题地址
1.寻找旋转排序数组中的最大值
题目描述:
- 给定一个旋转排序数组,要求找到其中的最大值。可以使用双指针法来解决该问题,首先找到旋转的位置,然后从两端开始向中间遍历数组,找到符合要求的两个数。
解题思路:
- 该题使用双指针法,首先找到旋转的位置,然后从两端开始向中间遍历数组,找到符合要求的两个数。时间复杂度为 O(n),空间复杂度为 O(1)。
代码示例:
def findMax(nums):
left, right = 0, len(nums) - 1
while left < right:
pivot = nums[left]
while left <= right and nums[left] <= pivot:
left += 1
while left <= right and nums[right] > pivot:
right -= 1
if left > right:
break
nums[left], nums[right] = nums[right], nums[left]
return nums[right]
小结:
“寻找旋转排序数组中的最大值”考察了双指针法的应用,通过巧妙地利用旋转排序数组的特性,找到了最大值的位置。
2.反转字符串中的单词顺序
题目描述:
- 给定一个字符串,要求反转字符串中每个单词的顺序并返回结果。可以使用字符串的 split() 方法拆分单词,并使用列表推导式反转每个单词最后使用 join() 方法将单词列表连接成字符串。
解题思路:
- 该题可以使用字符串的 split() 方法将字符串拆分成单词列表,然后使用列表推导式将每个单词反转,最后使用 join() 方法将单词列表连接成字符串时间复杂度为 O(n)空间复杂度为 O(n)。
代码示例:
def reverseWords(s):
words = s.split() # 将字符串按空格拆分成单词列表
reversed_words = [w[::-1] for w in words] # 将每个单词反转
return ' '.join(reversed_words) # 将单词列表用空格连接成字符串并返回
小结:
“反转字符串中的单词顺序”则涉及到字符串操作和列表推导式的使用,通过拆分、反转和连接字符串,实现了单词顺序的反转。
3.分割回文子串
解题思路:
- 该题可以使用动态规划算法来解决。定义一个二维数组 dp,其中 dp[i][j] 表示 s[i...j] 是否为回文串。状态转移方程为 dp[i][j] = (s[i] == s[j]) && dp[i+1][j-1],即当前字符相等且左右两侧子串均为回文串。时间复杂度为 O(n^2),空间复杂度为 O(n^2)。具体实现可以参考代码中的注释。
代码示例:
def longestPalindrome(s):
start, max_len = 0, 0
for i in range(len(s)):
if i - max_len > 1: # 如果当前位置距离最长回文子串的起始位置超过1个字符,则更新起始位置和最大长度
start = i - max_len - 1
left, right = start, i - 1 # 定义左右指针,初始化为最长回文子串的起始位置和当前位置的前一个位置
while left >= 0 and right < len(s) and s[left] == s[right]: # 如果左右指针所指的字符相等,则左右指针都向内移动一位,并更新最大长度为左右指针的距离加一
max_len += 2
left -= 1
right += 1
return start, max_len // 2 # 返回最长回文子串的起始位置和长度的一半(因为子串长度是偶数)
小结:
- “分割回文子串”实际上在描述和代码上存在一些混淆,但其核心是考察回文串的识别和动态规划的应用。通过定义一个二维数组来记录子串的回文状态,并利用状态转移方程来求解最长回文子串。
4.移动零
题目描述:
- 给定一个数组 nums,编写一个函数将所有 0 的元素移动到数组的末尾,同时保持非零元素的相对顺序不变。
需求示例:
输入: [0, 1, 0, 3, 12]
输出: [1, 3, 12, 0, 0]
代码实现:
def move_zeros_to_end(nums):
# 使用双指针法,将非零元素移动到数组前面
non_zero_idx = 0
for num in nums:
if num != 0:
nums[non_zero_idx] = num
non_zero_idx += 1
# 将剩余的位置填充为0
for i in range(non_zero_idx, len(nums)):
nums[i] = 0
return nums
小结:
“移动零”是一个相对简单的问题,通过双指针法将非零元素移动到数组前面,并在剩余位置填充零,实现了数组的调整。
5.旋转矩阵
题目描述:
- 给定一个二维数组 matrix,将其按照顺时针方向旋转 90 度并返回结果。
需求示例:
输入:
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
输出:
[
[7, 4, 1],
[8, 5, 2],
[9, 6, 3]
]
代码实现:
def rotate_matrix(matrix):
n = len(matrix)
# 顺时针旋转90度相当于矩阵转置后再翻转每一行
matrix = [list(x) for x in zip(*matrix)] # 转置矩阵
for i in range(n):
matrix[i] = matrix[i][::-1] # 翻转每一行
return matrix