当前位置:实例文章 » 其他实例» [文章]剑指offer刷题笔记--Num51-60

剑指offer刷题笔记--Num51-60

发布人:shili8 发布时间:2025-02-05 15:50 阅读次数:0

**剑指Offer刷题笔记--Num51-60**

### Num51. 数组中的逆序对**问题描述:**
给定一个长度为n的数组,求出其中所有数字两两相加的逆序对的数量。

**示例:**
输入:[1,2,3,4,5]
输出:16**解决方案:**

def reversePairs(nums):
 def mergeSort(left, right):
 if left == right:
 return0 mid = (left + right) //2 count = mergeSort(left, mid) + mergeSort(mid +1, right)
 # 将左半部分和右半部分合并到一起 i, j = left, mid +1 temp = []
 while i <= mid and j <= right:
 if nums[i] > nums[j]:
 count += mid - i +1 temp.append(nums[j])
 j +=1 else:
 temp.append(nums[i])
 i +=1 # 将剩余的元素添加到temp中 while i <= mid:
 temp.append(nums[i])
 i +=1 while j <= right:
 temp.append(nums[j])
 j +=1 nums[left:right +1] = temp return count return mergeSort(0, len(nums) -1)


### Num52. 最大子序列和**问题描述:**
给定一个长度为n的数组,求出其中最大连续子序列的和。

**示例:**
输入:[-2,1,-3,4,-1,2,1,-5,4]
输出:6**解决方案:**

def maxSubArray(nums):
 if not nums:
 return0 dp = [0] * len(nums)
 dp[0] = nums[0]
 for i in range(1, len(nums)):
 dp[i] = max(dp[i -1], nums[i])
 return max(dp)


### Num53. 最大子序列乘积**问题描述:**
给定一个长度为n的数组,求出其中最大连续子序列的乘积。

**示例:**
输入:[2,3,-2,4]
输出:6**解决方案:**

def maxProduct(nums):
 if not nums:
 return0 dp = [0] * len(nums)
 dp[0] = nums[0]
 for i in range(1, len(nums)):
 dp[i] = max(dp[i -1], nums[i])
 min_val = max_val = nums[0]
 for num in nums:
 if num < 0:
 min_val, max_val = max_val, min_val min_val = min(min_val, num)
 max_val = max(max_val, num)
 return max_val


### Num54. 最大子序列和为k的子序列**问题描述:**
给定一个长度为n的数组和一个整数k,求出其中最大连续子序列的和等于k。

**示例:**
输入:[1,2,-2,3], k =3输出:3**解决方案:**

def maxSubArrayLen(nums, k):
 if not nums or k < 0:
 return0 prefix_sum = [0] * (len(nums) +1)
 for i in range(len(nums)):
 prefix_sum[i +1] = prefix_sum[i] + nums[i]
 max_len =0 for i in range(len(nums) +1):
 for j in range(i, len(nums) +1):
 if prefix_sum[j] - prefix_sum[i -1] == k:
 max_len = max(max_len, j - i)
 return max_len


### Num55. 最大子序列和为k的子序列(二分查找)

**问题描述:**
给定一个长度为n的数组和一个整数k,求出其中最大连续子序列的和等于k。

**示例:**
输入:[1,2,-2,3], k =3输出:3**解决方案:**

def maxSubArrayLen(nums, k):
 if not nums or k < 0:
 return0 prefix_sum = [0] * len(nums)
 for i in range(len(nums)):
 prefix_sum[i] = prefix_sum[i -1] + nums[i]
 left, right =0, len(nums) -1 while left <= right:
 mid = (left + right) //2 if prefix_sum[mid] == k:
 return mid +1 elif prefix_sum[mid] < k:
 left = mid +1 else:
 right = mid -1 return -1


### Num56. 最大子序列和为k的子序列(前缀和)

**问题描述:**
给定一个长度为n的数组和一个整数k,求出其中最大连续子序列的和等于k。

**示例:**
输入:[1,2,-2,3], k =3输出:3**解决方案:**

def maxSubArrayLen(nums, k):
 if not nums or k < 0:
 return0 prefix_sum = [0] * len(nums)
 for i in range(len(nums)):
 prefix_sum[i] = prefix_sum[i -1] + nums[i]
 max_len =0 for i in range(len(nums) +1):
 for j in range(i, len(nums) +1):
 if prefix_sum[j] - prefix_sum[i -1] == k:
 max_len = max(max_len, j - i)
 return max_len


### Num57. 和为k的子序列**问题描述:**
给定一个长度为n的数组和一个整数k,求出其中所有数字之和等于k的子序列。

**示例:**
输入:[1,2,-2,3], k =3输出:[[1,2],[3]]

**解决方案:**

def subarraySum(nums, k):
 if not nums:
 return []
 prefix_sum = [0] * len(nums)
 for i in range(len(nums)):
 prefix_sum[i] = prefix_sum[i -1] + nums[i]
 res = []
 for i in range(len(nums) +1):
 for j in range(i, len(nums) +1):
 if prefix_sum[j] - prefix_sum[i -1] == k:
 res.append(nums[i -1:j])
 return res


### Num58. 和为k的子序列(前缀和)

**问题描述:**
给定一个长度为n的数组和一个整数k,求出其中所有数字之和等于k的子序列。

**示例:**
输入:[1,2,-2,3], k =3输出:[[1,2],[3]]

**解决方案:**

def subarraySum(nums, k):
 if not nums:
 return []
 prefix_sum = [0] * len(nums)
 for i in range(len(nums)):
 prefix_sum[i] = prefix_sum[i -1] + nums[i]
 res = []
 for i in range(len(nums) +1):
 for j in range(i, len(nums) +1):
 if prefix_sum[j] - prefix_sum[i -1] == k:
 res.append(nums[i -1:j])
 return res


### Num59. 和为k的子序列(二分查找)

**问题描述:**
给定一个长度为n的数组和一个整数k,求出其中所有数字之和等于k的子序列。

**示例:**
输入:[1,2,-2,3], k =3输出:[[1,2],[3]]

**解决方案:**

def subarraySum(nums, k):
 if not nums:
 return []
 prefix_sum = [0] * len(nums)
 for i in range(len(nums)):
 prefix_sum[i] = prefix_sum[i -1] + nums[i]
 res = []
 left, right =0, len(nums) -1 while left <= right:
 mid = (left + right) //2 if prefix_sum[mid] == k:
 res.append(nums[:mid +1])
 break elif prefix_sum[mid] < k:
 left = mid +1 else:
 right = mid -1 return res


### Num60. 和为k的子序列(前缀和)

**问题描述:**
给定一个长度为n的数组和一个整数k,求

其他信息

其他资源

Top