题目1描述:
最大序列和
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
解题思路:
当序列中只含有负数的时候,选择最大的负数;一般考虑数组包含一到多个非负数,此时若序列首个元素为负数,则这个元素只会使总和减小,因此必定可以将其删除,使得序列起始元素必为正数。同理若前缀为负数,则可以将这个前缀删除。因此python代码如下:
class Solution:
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
max = 0
sum = 0
i = 0
while i < len(nums):
sum += nums[i]
if sum > max:
max = sum
if sum < 0:
sum = 0
i += 1
return max
题目2描述:
全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
解题思路:
使用递归不断地找。代码如下:
class Solution:
def add_ele(exist, rest):
if(len(rest) == 1):
result_lists = exist[:]
result_lists.append(rest[0])
return result_lists
exist_lists = []
rest_lists = []
result_lists = []
i = 0
while i < len(rest):
exist_lists.append(exist[:])
rest_lists.append(rest[:])
i += 1
j = 0
while j < len(rest):
exist_lists[j].append(rest[j])
rest_lists[j].remove(rest[j])
return_lists = Solution.add_ele(exist_lists[j], rest_lists[j])
if type(return_lists[0]) == int:
result_lists.append(return_lists)
else:
result_lists = result_lists + return_lists
j += 1
return result_lists
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if len(nums) == 1:
return [nums[:]]
return Solution.add_ele([], nums)
题目3描述:
两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
nums1 = [1, 3] nums2 = [2] 中位数是 2.0
示例 2:
nums1 = [1, 2] nums2 = [3, 4] 中位数是 (2 + 3)/2 = 2.5
解题思路:
因为算法复杂度被要求为O(log (m+n)) ,因此最好的方法是将这两个列表排序之后找到其中位数,具体代码如下:
class Solution:
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
result = []
i1, i2 = 0, 0
while i1 < len(nums1) or i2 < len(nums2):
if i1 < len(nums1) and i2 < len(nums2):
if nums1[i1] <= nums2[i2]:
result.append(nums1[i1])
i1 += 1
else:
result.append(nums2[i2])
i2 += 1
elif i1 < len(nums1):
while i1 < len(nums1):
result.append(nums1[i1])
i1 += 1
else:
while i2 < len(nums2):
result.append(nums2[i2])
i2 += 1
print(result)
if len(result) % 2 == 1:
return result[int(len(result)/2)]
return (result[int(len(result)/2-1)]+result[int(len(result)/2)])/2